我想嵌套TransactionScopes(.net 4.0),因爲你會在SQL Server中嵌套事務,但它看起來像他們運作不同。我希望我的子事務能夠在它們失敗時回滾,但允許父事務決定是否提交/回滾整個操作。問題是第一次完成時,事務回滾。我意識到完成不同於承諾。嵌套/子TransactionScope回滾
A的什麼,我試圖做的大大簡化例子:
static void Main(string[] args)
{
using(var scope = new TransactionScope()) // Trn A
{
// Insert Data A
DoWork(true);
DoWork(false);
// Rollback or Commit
}
}
// This class is a few layers down
static void DoWork(bool fail)
{
using(var scope = new TransactionScope()) // Trn B
{
// Update Data A
if(!fail)
{
scope.Complete();
}
}
}
如果我使用這些選項我不能使用抑制或RequiresNew選項Trn鍵乙依賴於Trn鍵A.插入數據,Trn B被Trn A阻止。
任何想法如何讓它工作,或者甚至可以使用System.Transactions命名空間?
感謝
謝謝你,我很害怕這樣的答案。 – 2010-06-10 05:05:22
我沒有得到它:爲什麼答案令人失望? Robert希望任何內部範圍都能夠回滾,而只有最外層的才能夠提交。一個簡單的解決方案是:在每個作用域中,如果不想回滾,請調用complete()。那麼最外層的範圍可以選擇提交,只有當所有內層人員都選擇不回滾時。 – Alireza 2013-02-16 10:57:56
@Alireza:OP想要選擇性地提交某些內部事務,同時回滾所有未明確提交的* else *。你的「簡單的解決方案」就是'TransactionScope'的工作方式,並且被記錄爲可以工作,並且被這個答案清楚地解釋,但是如果外部範圍沒有完成,它實際上不會提交在任何內部範圍中所做的更改。這根本不可能使用'System.Transactions'。 – Aaronaught 2013-02-16 16:43:03