来自mysql手册(https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks.html ):
要减少死锁的可能性,请使用事务而不是lock tables语句
在innodb中如何使用锁表实现死锁?
例如,如果我写
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t4 WRITE;
... do something with tables t1-t4 here ...
COMMIT;
UNLOCK TABLES;
我真的必须每次执行这个脚本时都检查错误,比如1213吗?
1条答案
按热度按时间a6b3iqyw1#
如果确保在一个lock tables语句中锁定所有要读取或写入的表,则应该能够避免死锁。
如果可以使用事务,另一个避免使用锁表的好理由是允许行级锁。锁定表只在表级别锁定,这意味着并发会话不能接触表中的任何行,即使您的会话不需要锁定它们。
对于需要允许多个会话同时访问表的软件来说,这是一个缺点。您正在强制表级锁定,这将限制软件的吞吐量,因为访问表的所有会话都将彼此排队,并强制串行执行。
你说的“使用t2”是什么意思?读锁?如果我只使用写锁,比如我的例子。
我想他的意思是如果你读t2表。由于该表已被锁定以供写入,因此还包括阻止该表的任何读卡器。在解锁之前,其他会话无法读取或写入表。
我不在乎表现。我有一种情况,我想使事情尽可能简单,锁表对我来说比使用带有偏执级别错误检查的事务更直观。
您最终会找到一个希望您的软件具有良好性能的案例。您将不得不更加自如地使用事务。