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。 –