1

質問はmysqlトランザクションについてです。

create table tbl1(
    id integer,
    val integer,
    primary key (id)
);
insert into tbl1 (id, val) values (1,2);

同時に作業する 2 人のユーザーを作成しました。

USER1                                         USER2
start transaction;

update tbl1 set val = 3 where id = 1;

                                      delete from tbl2 where id = 1 and val = 3;

commit;

その結果、行は削除されません。修正方法は?削除クエリが最初のユーザーのトランザクションの開始よりも後に来るため、行が削除されることを望みます。

編集:実際には行が削除されるため、その理由についての説明はありません。

4

1 に答える 1

3

@ capoluca -競合状態があります。それを解決できる、単純で万能な答えはありません。

  • 現在のコードでは:

    a)更新に発生した場合、削除は行われません

    b)トランザクション中に削除が発生した場合、削除は「元に戻されます」

    c) 「更新」トランザクションの完了後に削除行われる場合、削除が行われます。

  • 1 つの解決策は、テーブルをロックすることです。

    これは必ずしもすべてのデータベースに移植できるわけではなく、パフォーマンスに壊滅的な影響を与える可能性があります。

  • 別の解決策は、単純に「気にしない」ことです。ビジネス要件によっては、これは実際には正当な選択になる可能性があります。また、「削除」がバッチ ジョブの一部である場合は、完全にうまく機能する可能性があります。その場合、問題のレコードは遅かれ早かれ確実に削除されるはずです。

  • さらに別の解決策は、更新と削除の両方を独自の個別のトランザクションに入れることです

上で引用したリンクを見て、あなたの状況に最も適したものを見つけてください。

于 2012-09-24T20:08:25.927 に答える