テーブルアカウントには、デーモンの 1 つでアカウントが更新のためにブロックされていることをデーモンが知るための特別なフィールド「executor」があります。
ステップバイステップ:
- 取引開始
アカウントをブロック:
UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;いくつかの操作。このステップ中に、別のデーモンが id=1234 の行を選択して、それを更新しようとする (または、「エグゼキュータ」ではなく別のフィールドを更新する) ことができます。
アカウントのステータスは次のように返されます:
UPDATE `account` SET `executor` = NULL WHERE `executor` = 2727 AND `id` = 1234;- 専念
ステップ 4 で mysql が成功の実行ステータスを返す場合がありますが、0 行が影響を受けます。10000回のトランザクションで1回発生します。
私は何を間違っていますか?それともmysqlのバグですか?
アップデート:
観察の後、私は次のことを得る:
1) まずやること
UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
2) トランザクション ブロック レコード
3) お取引の際は
`UPDATE `account` SET `balance` = 1 WHERE `id` = 1234;`
4) このクエリの後
SELECT `executor` FROM `account` WHERE `id`=1234
結果2727を与える
ポイント 3 と 4 を数回繰り返した後、result executor=NULL... または 0 を取得します。結果を int 型の変数に書き込むためです。いずれにせよエグゼキュータは値 2727 ではなくなりました
さらにトランザクションがロールバックされます...もう一度操作を繰り返すと、エグゼキューターの値をリセットしなくてもすべて問題ありません...