0

テーブルアカウントには、デーモンの 1 つでアカウントが更新のためにブロックされていることをデーモンが知るための特別なフィールド「executor」があります。

ステップバイステップ:

  1. 取引開始
  2. アカウントをブロック:

    UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
    
  3. いくつかの操作。このステップ中に、別のデーモンが id=1234 の行を選択して、それを更新しようとする (または、「エグゼキュータ」ではなく別のフィールドを更新する) ことができます。

  4. アカウントのステータスは次のように返されます:

    UPDATE `account` SET `executor` = NULL WHERE `executor` = 2727 AND `id` = 1234;
    
  5. 専念

ステップ 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 ではなくなりました

さらにトランザクションがロールバックされます...もう一度操作を繰り返すと、エグゼキューターの値をリセットしなくてもすべて問題ありません...

4

0 に答える 0