【发布时间】:2015-12-21 19:11:04
【问题描述】:
using (Transactions.TransactionScope tx = new Transactions.TransactionScope()) {
using (SqlConnection conn = new SqlConnection(CONNECTIONSTRING)) {
conn.Open();
var cmd = new SqlCommand("Update Officer1s Set isLocked='Y' where a='b'", conn); //refer to an nonexsiting name on purpose.
var transaction = conn.BeginTransaction();
cmd.Transaction = transaction;
try {
var a = cmd.ExecuteNonQuery();
} catch (Exception ex) {
transaction.Rollback();//Invalid object name 'Officer1s'.
}
using (SqlConnection conn2 = new SqlConnection(CONNECTIONSTRING)) {
conn2.Open(); //throw exception
}
}
}
在我的真实应用中,入口方法是被TransactionScope包围的。入口方法调用了很多方法,而且很深。如果在任何连接中 sql 抛出任何 SqlException(为了演示,我故意引用一个不存在的名称)并回滚内部事务,那么我无法打开第二个连接,因为将抛出异常说“事务已中止”。
为什么外部事务中止?是否支持这种用法?
我使用的是 SQL Server 2014。
【问题讨论】:
-
sql-server 中的嵌套事务是一个神话。 “外部”事务除了增加事务计数的值之外什么都没有。并且回滚将回滚事务并将计数器重置为 0。
标签: c# sql-server database transactions