我有时会收到 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 rows ... FOR UPDATE”的事务是 process_id = null 的地方。从理论上讲,它们永远不应该重叠。
我想知道是否有适当的方法来避免这些死锁?
是否会发生死锁,因为一个事务在选择/更新时锁定表的时间过长,而另一个进程试图执行相同的事务并且只是超时?
任何帮助深表感谢