TransactionScope:“交易已中止”在某些电脑上 [英] TransactionScope: "The transaction has aborted" on some computers

查看:91
本文介绍了TransactionScope:“交易已中止”在某些电脑上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我在C#/ WPF项目中遇到使用TransactionScope的一些问题。我使用如下所述的TransactionScope:

I'm experiencing some issues using TransactionScope in my C#/WPF project. I use TransactionScope as outlined here:

http://bartdesmet.net/blogs/bart/archive/2006/11/19/Windows- Vista-_2D00_-介绍-TxF-in-C_2300 _-_ 2800_part-2_2900 _-_ 2D00_-Using-System.Transactions-and-the-DTC.aspx

问题在于这适用于我们大多数用户的计算机,但是我收到了一些来自"交易已中止"的人的报告。错误。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆