Я пытаюсь вложить TransactionScopes (.net 4.0) так же, как вы вкладываете транзакции в SQL Server, однако похоже, что они работают по-другому. Я хочу, чтобы мои дочерние транзакции могли откатываться, если они терпят неудачу, но позволяю родительской транзакции решать, следует ли зафиксировать / откатить всю операцию. Проблема в том, что когда происходит первое завершение, транзакция откатывается. Я понимаю, что завершить это совсем не так.
Очень упрощенный пример того, что я пытаюсь сделать:
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();
}
}
}
Я не могу использовать параметры «Подавить» или «Требовать нового», поскольку Trn B использует данные, введенные Trn A. Если я использую эти параметры, Trn B блокируется Trn A.
Есть идеи, как заставить его работать или, если это возможно, использовать пространство имен System.Transactions?
Спасибо