TransactionScope:“交易已中止”在某些电脑上 [英] TransactionScope: "The transaction has aborted" on some computers
问题描述
我在C#/ WPF项目中遇到使用TransactionScope的一些问题。我使用如下所述的TransactionScope:
I'm experiencing some issues using TransactionScope in my C#/WPF project. I use TransactionScope as outlined here:
问题在于这适用于我们大多数用户的计算机,但是我收到了一些来自"交易已中止"的人的报告。错误。
The problem is that this works on most of our users' computers, but I've had several reports from people that get the "The transaction has aborted" error.
代码如下所示:
//执行所有安装操作作为交易
使用(TransactionScope tx = new TransactionScope())
{
DoSomeTransactionalStuff();
//提交交易
tx.Complete();
}
// Execute all install operations as a transaction
using (TransactionScope tx = new TransactionScope())
{
DoSomeTransactionalStuff();
// Commit the transaction
tx.Complete();
}
...
void DoSomeTransactionalStuff()
{
if(Transaction.Current!= null)
{
    Ktm.IKernelTransaction tx =(Ktm.IKernelTransaction)TransactionInterop.GetDtcTransaction(Transaction.Current);
    IntPtr txh = IntPtr.Zero;
   试试
    {
        tx.GetHandle(out txh);
        if(txh == IntPtr.Zero)
           抛出新的例外("CopyFileTransacted:无法获得交易处理。");
$
        CopyFileFlags copyFileFlags = 0;
        if(!overwrite)
            copyFileFlags = CopyFileFlags.COPY_FILE_FAIL_IF_EXISTS;
        if(!CopyFileTransacted(src,dst,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero,copyFileFlags,txh))
           抛出新的异常(string.Format("无法将{0}复制到{1}。CopyFileTransacted()失败:{2}",
src,dst,Marshal.GetLastWin32Error()));
$
    }
   终于
    {
        if(txh!= IntPtr.Zero)
            CloseHandle(txh);
    }
} b $ b}
void DoSomeTransactionalStuff()
{
if (Transaction.Current != null)
{
Ktm.IKernelTransaction tx = (Ktm.IKernelTransaction)TransactionInterop.GetDtcTransaction(Transaction.Current);
IntPtr txh = IntPtr.Zero;
try
{
tx.GetHandle(out txh);
if (txh == IntPtr.Zero)
throw new Exception("CopyFileTransacted: Could not get transaction handle.");
CopyFileFlags copyFileFlags = 0;
if (!overwrite)
copyFileFlags = CopyFileFlags.COPY_FILE_FAIL_IF_EXISTS;
if (!CopyFileTransacted(src, dst, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, copyFileFlags, txh))
throw new Exception(string.Format("Could not copy {0} to {1}. CopyFileTransacted() failed: {2}",
src, dst, Marshal.GetLastWin32Error()));
}
finally
{
if (txh != IntPtr.Zero)
CloseHandle(txh);
}
}
}
正如我所说,代码在我的大多数用户的计算机上运行良好。这不是超时问题,因为DoSomeTransactionalStuff()在创建事务后立即运行,并且日志中没有延迟。
As I said, the code works perfectly on most of my users' computers. This is not a timeout issue since DoSomeTransactionalStuff() runs right after the transaction is created and there's no delay in the log.
这是来自我的一个用户的堆栈跟踪:
Here's the stack trace from one of my users:
11-03-2011 17:46:18 - RunScript:操作失败:transacçã o foi abortada ..
11-03-2011 17:46: 18 - RunScript:跟踪: em System.Transactions.TransactionStateAborted.CheckForFinishedTransaction(InternalTransaction tx)
em System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
em System.Transactions.Transaction.Promote()
em System.Transactions.TransactionInterop.ConvertToOletxTransaction(交易交易)
em System.Transactions.TransactionInterop.GetDtcTransaction(交易交易)
em Updater.Actions.CopyFileAction.DoCopyFile(String src,String dst,Boolean overwrite)
em Updater.Actions.CopyFileAction.Execute(XmlNode actionNode,VariableExpander expandder)
em Updater.ClientUpdater.RunScript(String scriptPath,String extractDir,String installDir)。
11-03-2011 17:46:18 - RunScript: Action failed: A transacção foi abortada..
11-03-2011 17:46:18 - RunScript: Trace: em System.Transactions.TransactionStateAborted.CheckForFinishedTransaction(InternalTransaction tx)
em System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
em System.Transactions.Transaction.Promote()
em System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
em System.Transactions.TransactionInterop.GetDtcTransaction(Transaction transaction)
em Updater.Actions.CopyFileAction.DoCopyFile(String src, String dst, Boolean overwrite)
em Updater.Actions.CopyFileAction.Execute(XmlNode actionNode, VariableExpander expander)
em Updater.ClientUpdater.RunScript(String scriptPath, String extractDir, String installDir).
推荐答案
嗨Soren,
Hi Soren,
发生这种情况时,您是否在事件日志中收到任何事件?看起来可能存在向分布式事务提升的问题,这可能表明DTC配置不正确。
Do you get any events in the event log when this happens? It looks like there may be a problem promoting to a distributed transaction which could indicate DTC is not configured correctly.
这篇关于TransactionScope:“交易已中止”在某些电脑上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!