我正在測試以查看嵌套事務如何工作,並發現了這種令人不安和意外的行爲。即使從未調用TransactionScope.Complete(),爲什麼還要提交嵌套事務?
using(TransactionScope otx = new TransactionScope())
using(SqlConnection conn1 = new SqlConnection("Server=S;Database=DB;Trusted_Connection=yes"))
using(SqlCommand cmd1 = conn1.CreateCommand())
{
conn1.Open();
cmd1.CommandType = CommandType.Text;
cmd1.CommandText = "INSERT INTO FP.ACLs (ChangeToken,ACL) VALUES (1,0x)";
cmd1.ExecuteNonQuery();
using(TransactionScope itx = new TransactionScope(TransactionScopeOption.RequiresNew))
using(SqlConnection conn2 = new SqlConnection("Server=S;Database=DB;Trusted_Connection=yes"))
using(SqlCommand cmd2 = conn1.CreateCommand())
{
conn2.Open();
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "INSERT INTO FP.ACLs (ChangeToken,ACL) VALUES (2,0x)";
cmd2.ExecuteNonQuery();
// we don't commit the inner transaction
}
otx.Complete(); // nonetheless, the inner transaction gets committed here and two rows appear in the database!
}
我看到this other question,但該解決方案並不適用。
如果我沒有指定TransactionScopeOption.RequiresNew(即我沒有使用嵌套事務,只是一個嵌套的作用域),那麼整個事務將在內部作用域未完成時回滾,並且在發生錯誤時調用otx.Complete()。這可以。
但我當然不希望嵌套事務在未成功完成時被提交!有人知道這裏發生了什麼,我怎麼能得到預期的行爲?
數據庫是SQL Server 2008 R2。
如果你打算每個查詢使用一個TransactionScope,你爲什麼要使用它們? – 2011-05-31 12:04:09