Error number: MY-013453; Symbol: ER_LOCK_ORDER_DEPENDENCIES_SYNTAX; SQLSTATE: HY000
Message: Lock order dependencies file (%d:%d) – (%d:%d) : %s
错误说明:
MySQL 错误号 MY-013453、符号 ER_LOCK_ORDER_DEPENDENCIES_SYNTAX 和 SQLSTATE 设置为 HY000 都是表示锁顺序相互依赖语法出错的错误代码,指当试图在 SELECT 语句中建立一个锁顺序相互依赖时,表达式有语法问题。
假设你有一个包含两个表的查询,而团队要求其中一个表(table1)必须是 For Share 锁模式,另一个表(table2)必须是 For Update 锁模式。但是当尝试用以下示例查询时,它就会触发此错误:
SELECT *
FROM table1 LOCK IN SHARE MODE, table2 FOR UPDATE;
这是因为上面的表达式中的语法有误,正确的语法应该如下所示:
SELECT *
FROM table1 LOCK IN SHARE MODE, table2 LOCK IN UPDATE MODE;
解决方法:
为了解决上述错误,只需确保在 SELECT 查询中对表的排序依赖表达式的语法正确即可。如果需要给几个不同的表加锁,才需要在第一个表后跟着关键字 LOCK IN,然后指定依次后续表所采用的锁模式。
例如,你还可以在上述语句中添加新表,并需要在这个表上也加锁,这时只需要在第一个表后面添加 LOCK IN 关键字就可以了,这样就可以遵循上述的语法规范:
SELECT *
FROM table1 LOCK IN SHARE MODE, table2 LOCK IN UPDATE MODE, table3 LOCK IN SHARE MODE;
我们也可以使用其他位置来指定 LOCK IN,例如:
SELECT *
FROM table1, table2 LOCK IN SHARE MODE, table3 FOR UPDATE;
值得指出的是,如果你试图在同一个表上指定不同的锁模式,那么也可能会触发此错误信息,因此应该注意避免。