:ロックを取得しようとしたときに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つの以上のプロセスが、リソースが重複をロックされているような方法でロックを要求したが、異なる順序で発生したとき
使用しているMySQLストレージエンジンはどれですか? InnoDBまたはMyISAM? –