C# 如何使用TransactionScope?

C# 如何使用TransactionScope?,c#,.net,db2,transactionscope,distributed-transactions,C#,.net,Db2,Transactionscope,Distributed Transactions,我试图在分布式事务下更新DB2数据库(通过NHibernate),但它一直失败 以下是我编写的代码: public bool ExecuteUsingDTC(List<Func<bool>> tasks) { var result = false; using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (var sessio

我试图在分布式事务下更新DB2数据库(通过NHibernate),但它一直失败

以下是我编写的代码:

public bool ExecuteUsingDTC(List<Func<bool>> tasks)
{
    var result = false;
    using (var scope = new TransactionScope(TransactionScopeOption.Required))
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            //carry out db modification tasks
            tasks.ForEach(task => { result = result && task.Invoke(); })
            transaction.Commit();
        }
        scope.Complete();
    }

    return result;
}

像这样使用TransactionScope

using(var scope = new TransactionScope(...))
{

    transaction.Complete();
}
为您开始并提交事务。如果抛出异常,则正在处理的作用域将中止事务,而不调用Complete

我怀疑您的问题是,您还有一个额外的显式调用来执行BeginTransaction/Commit。除去这些,假设NHibernate与TransactionScope配合得很好,那么一切都应该很好

使用TransactionScope可能涉及使用分布式事务协调器(DTC)。如果是这样,您需要打开管理工具|组件服务。导航到分布式事务协调器|本地DTC。右键单击“属性”、“安全性”选项卡。启用安全性,并首先启用所有功能。如果有效,请读取DTC安全性,并将其降至最低


或者按照DanVallejo的建议,删除TransactionScope,只使用显式事务。

谢谢,即使使用了您的代码,我仍然会遇到异常:错误[HY011][IBM]CLI0126E操作此时无效。SQLSTATE=hy011您关于DTC的说明适用于托管DB2数据库的机器,对吗?可能吧,但我已经有一段时间没有配置DTC了。可以是客户机和/或服务器。现在我想起来了,我意识到我一直在客户机上使用设置,而不是在DB2服务器上。也许我需要更改DB2服务器上的配置以启用XA事务,但它是一台大型机计算机,而不是windows。我想你现在只能靠自己了。我没有DB2方面的经验。我已经使用DB2客户机多年,但从未成功地使用过TransactionScope。必须手动创建事务。@JohannBlais您是如何处理分布式事务的?不,我不是。但对我来说,这不是一个强制性的功能。
using(var scope = new TransactionScope(...))
{

    transaction.Complete();
}