首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TransactionScope产生System.Transactions.TransactionException

TransactionScope产生System.Transactions.TransactionException
EN

Stack Overflow用户
提问于 2012-11-12 08:59:48
回答 2查看 1.9K关注 0票数 0

我有一个带有方法的数据库类,如下所示。foobar都是全无操作。因此,需要进行交易。请注意,我使用的是MySQL 5.5.21和MySQL .NET Connector 6.6.4

代码语言:javascript
复制
public void foo()
{
    using (var transaction = new TransactionScope())
    {
        // This call yields a 'System.Transactions.TransactionException'
        bar();

        insertStuff();

        transaction.Complete();
    }
}

public void bar()
{
    using (var transaction = new TransactionScope())
    {
        insertStuff();
        insertStuff();

        transaction.Complete();
    }
}

private void insertStuff()
{
    using (var connection = CreateConnection()) // Using the same connection string!
    {
        connection.ConnectionString = ConnectionString;
        connection.Open();
    }
}

我确实尝试在构造函数中指定TransactionScopeOption.RequiresNew,但是没有帮助。我还尝试在每个事务范围之前显式地打开一个连接,但仍然没有成功。

我想要的是:

  • 如果我单独调用bar,就应该有一个事务。
  • 如果我调用foo (然后调用bar),就应该有一个事务。

问:,我是面临MySQL .NET Connector的限制,还是做错了什么?

编辑:准确的错误是:操作对事务的状态无效。所以,一旦我在连接上打电话给Open(),交易就会中断.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-12 09:22:52

如图所示使用bar:

代码语言:javascript
复制
public void bar()
{
        insertStuff();
        insertStuff();
}

起作用了吗?

对于最佳实践,您可以使用IDbConnection.BeginTransaction()创建事务,因为事务是连接范围的。

代码语言:javascript
复制
public void foo()
{
    using(IDbConnection connection = new MySqlConnection(/*connection string*/))
    {
        connection.Open();
        using(IDbTransction transaction = connection.BeginTransaction())
        {
            bar(connection);
            insertStuff(connection);

            transaction.Commit();
        }

    }
}

public void bar(IDbConnection connection)
{
        insertStuff(connection);
        insertStuff(connection);
}

private void insertStuff(IDbConnection connection)
{
     // do stuff
}
票数 0
EN

Stack Overflow用户

发布于 2012-11-12 09:07:08

最有可能的情况是,您正在打开两个或更多到数据库的连接,并且在事务范围内,将调用MSDTC。通常,如果您想拥有一个事务,您将创建连接,然后将其传递给每个操作。这将确保您始终对同一连接进行更改。如果您有2个连接,那么每个连接上的更改都必须进行协调。

但是,如果您提供了更多的异常消息,则可能会更清楚原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13340758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档