0

以下に示すようなメソッドを持つデータベースクラスがあります。fooとは両方ともbarオールオアナッシング操作です。したがって、トランザクションの必要性。MySQL5.5.21をと一緒に使用していることに注意してくださいMySQL .NET Connector 6.6.4

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ましたが、役に立ちませんでした。また、各トランザクションスコープの前に明示的に接続を開こうとしましたが、それでも成功しませんでした。

私が欲しいのはこれです:

  • 私が一人で電話する場合、 1つのトランザクションbarがあるはずです。
  • 私が呼び出すとfoo(順番に呼び出す)、 1つのトランザクションbarがあるはずです。

Q:制限に直面していますか、MySQL .NET Connectorそれとも何か間違ったことをしていますか?

編集:正確なエラーは次のとおりです:操作はトランザクションの状態に対して無効です。 したがって、接続を呼び出すとすぐにOpen()、トランザクションは終了します...

4

2 に答える 2

0

次のようにバーを使用します。

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

仕事ですか?

ベスト プラクティスとして、IDbConnection.BeginTransaction() を使用してトランザクションを作成できます。これは、トランザクションが接続スコープであるためです。

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
}
于 2012-11-12T09:22:52.027 に答える
0

ほとんどの場合、データベースへの接続を 2 つ以上開いており、トランザクション スコープ内にあるため、MSDTC が呼び出されます。通常、1 つのトランザクションが必要な場合は、接続を作成してから、それを各操作に渡します。これにより、常に同じ接続で変更を行うことが保証されます。2 つの接続がある場合は、それぞれの変更を調整する必要があります。

ただし、より多くの例外メッセージを提供すると、原因がより明確になる可能性があります。

于 2012-11-12T09:07:08.303 に答える