using System;
using System.Transactions;
namespace ConsoleApplication3
{
public class Program
{
public static void Main(string[] args)
{
var trans = new TransactionScope(TransactionScopeOption.RequiresNew);
try
{
if (!ProcessMessage(true))
{
MoveMessageToErrorQueue();
}
trans.Complete();
}
catch (Exception)
{
trans.Dispose();
}
}
private static bool ProcessMessage(bool throwError)
{
//write to database
var trans = new TransactionScope(TransactionScopeOption.Required);
try
{
if (throwError)
throw new Exception();
trans.Complete();
return true;
}
catch (Exception)
{
trans.Dispose();
}
return false;
}
private static void MoveMessageToErrorQueue()
{
var trans = new TransactionScope(TransactionScopeOption.Required);
trans.Complete();
}
}
}
如何使MoveMessageToErrorQueue方法中的事務範圍在主事務中登記,而不是在ProcessMessage方法中的事務範圍中?嵌套事務的TransactionScope
當它試圖在MoveMessageToErrorQueue內部創建一個新的事務時,我得到一個異常,指出該事務已經被中止。
UPDATE
我得到同樣的結果,如果我用一個CommittableTransaction
using System;
using System.Transactions;
namespace ConsoleApplication3
{
public class Program
{
public static void Main(string[] args)
{
using (var trans = new CommittableTransaction())
{
try
{
if (!ProcessMessage(trans, true))
{
MoveMessageToErrorQueue(trans);
}
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
}
}
}
private static bool ProcessMessage(Transaction trans, bool throwError)
{
//write to database
var transScope = new TransactionScope(trans);
try
{
if (throwError)
throw new Exception();
transScope.Complete();
return true;
}
catch (Exception)
{
transScope.Dispose();
}
return false;
}
private static void MoveMessageToErrorQueue(Transaction trans)
{
var transScope = new TransactionScope(trans);
transScope.Complete();
}
}
}
基本上,如果在的ProcessMessage方法中的交易失敗我希望能夠仍然使用在同一根事務最後一種方法。
感謝您的任何幫助。
UPDATE 2
「在DTC交易(和使用該圖案的交易),故障是致命的和直接的一個註定標誌被設置:。它被設置」
這說明了一切。我認爲這種行爲是不同的。
看起來更像C# – cup
在原來的情況下,你可以通過複製構造函數將TransScope傳遞給MoveMessageToErrorQueue嗎? – cup
嗨,感謝您的評論,但我沒有關注你。 – Marco