我们目前正在开发一个项目,有许多交易。用户在队列表中添加顺序,另一个脚本处理事务。当add事务和队列引擎同时工作时,会发生死锁错误。
队列表
CREATE TABLE `order_queue` (
`OrderId` BIGINT(20) UNSIGNED NOT NULL,
`State` TINYINT(3) UNSIGNED NOT NULL COMMENT '1=adding, 11=proccessing, 2=complete',
`EngineId` SMALLINT(5) UNSIGNED NOT NULL,
`AddTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`OrderId`),
INDEX `State` (`State`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
添加交易记录
$db->beginTransaction();
$db->exec("INSERT INTO order_queue (OrderId, State, EngineId) VALUES ({$OrderId}, 1, 0)");
$db->commit();
最后我们有三个队列引擎来获取事务并发送另一个系统
$db->query("UPDATE order_queue SET State=11,EngineId={$EngineId} WHERE State=1 LIMIT 1");
$qOrder = $db->query("SELECT * FROM order_queue
WHERE State=11 AND EngineId={$EngineId}")->fetch();
echo $qOrder->OrderId;
//send the order to other systems
$db->exec("UPDATE order_queue SET State=2 WHERE OrderId={$qOrder->OrderId}");
如果这个脚本同时工作,就会出现最心爱的错误
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
我先尝试了几种方法 AddTime
,第二次更改 State
之后 $db->commit();
但问题没有解决。
如果你是我,你会怎么做?哪种方法最好?
1条答案
按热度按时间2nbm6dog1#
您可以尝试使用“锁定共享模式”,如下所示