2011-11-07 2 views
0

ロックを取得しようとしたときにMySQLのデッドロックが検出されないようにしました。 「私は時々言ってMySQLのデッドロックエラーを取得します

を」トランザクション再起動してみてくださいロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してください。

複数のPHPプロセスが同時にテーブルから行を選択して実行されているキューテーブルがあります。しかし、各プロセスのために、私はそれが選択されている重複する行を持っていないので、フェッチする行の一意のバッチを取得したい。

ので、私はこのクエリを実行します(私は上のデッドロックエラーを取得するクエリである)

$this->db->query("START TRANSACTION;"); 

    $sql = " SELECT mailer_queue_id 
       FROM mailer_queues 
       WHERE process_id IS NULL 
       LIMIT 250 
       FOR UPDATE;"; 
    ... 


    $sql = "UPDATE mailer_queues 
      SET  process_id = 33044, 
        status = 'COMPLETED' 
      WHERE mailer_queue_id 
       IN (1,2,3...);"; 

    ... 

    if($this->db->affected_rows() > 0) { 
     $this->db->query("COMMIT;");  
    } else{ 
     $this->db->query("ROLLBACK;");  
    } 

私もよ:

がテーブルに行を挿入(なし取引で/同時に同じ時間

ないトランザクション/ロックと(表中行の更新)でのロック)

だけでなく、同時に(なし取引/ロック付き)テーブルからの私の更新を行を削除し、更新のみを削除し、彼らはそれらに割り当てられたprocess_idをを持っている行を削除...、どこで私は "SELECT行... FOR UPDATE"はprocess_id = nullのトランザクションを実行します。理論的には重複してはならない。

これらのデッドロックを回避する適切な方法があるのでしょうか?

トランザクションが選択/更新中にテーブルを長時間ロックしているため、別のプロセスが同じトランザクションを実行しようとしていてタイムアウトしたためにデッドロックが発生する可能性がありますか?

任意のヘルプは非常に各プロセスがロックされているリソースを待っているように、2つの以上のプロセスが、リソースが重複をロックされているような方法でロックを要求したが、異なる順序で発生したとき

+0

使用しているMySQLストレージエンジンはどれですか? InnoDBまたはMyISAM? –

答えて

3

デッドロックが発生高く評価され他のプロセスが元のプロセスが開いているロックを待っていることを確認します。

実際のところ、建設現場を考えてみましょう.1個のドライバーと1個のネジがあります。 2人の労働者はスクリューで運転する必要があります。作業者#1はドライバをつかみ、作業者#2はねじをつかむ。労働者#1は、労働者#2によって保持されているので、ネジをつかむこともできますが、できません。作業員#2はドライバーが必要ですが、作業員#1がそれを保持しているため、取得できません。だから、彼らは必要な2つのリソースのうちの1つを持っているので、進歩することができず、デッドロックしています。どちらも丁寧で「ステップバック」にはなりません。

トランザクション外の変更が発生した場合、トランザクション内で予約しているロックされた領域と更新/削除の1つ(または複数)が重複している可能性があります。

+0

私の更新と削除に関する興味深い点は、process_idが割り当てられている行のみを更新して削除することです。ここでprocess_id = nullです。理論的には重複してはならない。 – koeder

2

トランザクションを開始する前にLOCK TABLESを試して、テーブルを明示的に制御できるようにすることができます。ロックは、特定のテーブルのすべてのアクティビティが完了するまで待機します。

0

ネット上の誰もがデッドロックについて非常によく説明していると思います。 Mysqlは、最後に起こったデッドロックをすべてチェックし、そのときに のクエリがスタックされているかどうかを確認する非常に優れたログを提供します。 これをチェックしてLATEST DETECTED DEADLOCK を検索すると、多くの微妙なデッドロックが見つかりました。

関連する問題