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
このようなことは可能ですか?