0

MySQL にコミットされていない/ロールバックされていないトランザクションがまだある場合、トランザクションを待機させるにはどうすればよいですか?

現在、次のように、DB ストアド プロシージャ側ではなく、コード側でトランザクションを実行しています。

cmd.Connection.BeginTransaction();
try {
    // db codes here
    cmd.Transaction.Commit();
} catch {
    cmd.Transaction.Rollback();
    throw;
} finally {
    cmd.Connection.Close();
}

前のトランザクションが完了するまで、他のトランザクションを待機させたい。一部のストアド プロシージャではMAX(id)、外部キーを挿入するときidに、同じトランザクションでも作成される自動インクリメント列を取得します。しかし、2 つのトランザクションが同時に発生した場合、上記の現在のセットアップでは機能しません。何が起こったかは次のとおりです。

Begin Trans1
Begin Trans2
Trans1: insert a values(); --id = 1
Trans2: insert a values(); --id = 1
Trans1: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1
Trans2: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1
Commit Trans1
Commit Trans2 --id = 2, aid = 1

私が望んでいたのは次のようなものです:

Begin Trans1
Wait Trans2
Trans1: insert a values(); --id = 1
Trans1: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1
Commit Trans1
Begin Trans2
Trans2: insert a values(); --id = 2
Trans2: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 2
Commit Trans2

このようなことは可能ですか?

4

1 に答える 1

1

IsolationLevel.ReadCommittedを使用することで、他のトランザクションによるトランザクションに関与するテーブルへのアクセスを回避できます

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);

また

TransactionScope クラスを使用できます。TransactionScope は、コードがコミットされない限り、コード ブロックをトランザクション対応にします。テーブルはロックされ、他のテーブルが同じテーブルを要求した場合、実行中のトランザクションがコミットまたはロールバックされるまで待機する必要があります。

参照

于 2013-08-27T06:25:14.957 に答える