我正在 ASP.Net 中执行提交例程。问题是,在调试 try-catch 块中的代码时,如果我/用户遇到错误,SQL 事务永远不会回滚。
如果我在两者之间中断此提交例程,SQL Server 2008 将完全挂起。即使从 SSMS 我也无法进行选择/插入操作。最后,我必须重新启动 SQL Server 才能回滚事务。
提交代码:
SqlConnection conn = Db.getConn();
if (conn.State == ConnectionState.Closed) conn.Open();
SqlTransaction trn;
trn = conn.BeginTransaction();
SqlCommand sqlCmd = new SqlCommand("", conn);
sqlCmd.Transaction = trn;
try
{
string query = GetQuery(); // works fine
sqlCmd.CommandText = query;
sqlCmd.ExecuteNonQuery();
using (SqlBulkCopy bcp = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default, trn))
{
bcp.ColumnMappings.Add("FaYear", "FaYear");
bcp.ColumnMappings.Add("CostCode", "CostCode");
bcp.ColumnMappings.Add("TokenNo", "TokenNo");
bcp.DestinationTableName = "ProcessTokenAddress";
bcp.WriteToServer(globaltblAddress.DefaultView.ToTable());
}
trn.commit();
}
catch (SqlException ex)
{
trn.Rollback();
}
注意:就在这里编写代码时,我意识到我已经捕获了 SqlException而不是Exception。这是导致错误的原因吗?呸?
重要提示:我是否需要在 Page_UnLoad 或其他一些可以处理意外情况的事件处理程序中回滚事务(例如,用户在事务进行时关闭浏览器,用户点击后退按钮等)。