daniel.gindi Asked: 2022-06-28 22:16:23 +0800 CST2022-06-28 22:16:23 +0800 CST 2022-06-28 22:16:23 +0800 CST `innodb_table_locks=0` 是个好主意吗? 772 我已经多次注意到 mysql 中的触发器会导致触发器中引用的每个表上的表锁定。即使没有真正触及,就像它在IF声明中一样。 如果我正确理解 MySql (8.x) 文档,设置innodb_table_locks=0将禁用这些。 现在这会对mysql服务器产生负面影响吗?任何性能/稳定性/完整性影响? 有什么理由我什至希望通过触发器(而不是单个查询)来锁定全表?(除了可能更容易的死锁检测?) 谢谢! mysql mysql-8.0 1 个回答 Voted Best Answer Bill Karwin 2022-06-29T09:21:18+08:002022-06-29T09:21:18+08:00 如果您使用 LOCK TABLES WRITE 锁定表,那么您对该表进行更改,它会调用触发器,并且在该触发器中,访问其他表。默认行为是其他表被锁定。 如果设置innodb_table_locks=0,则这些触发器访问的其他表不会被锁定。 因此,如果其他会话在其他表中有一些行锁,这将有所帮助,因为您调用触发器的操作不必等待表锁。 另一方面,如果您的触发器代码依赖于对其他表的独占访问来避免竞争条件,那么您可能会破坏它,并获得难以调试的竞争条件。 如果您在正常使用表时不使用 LOCK TABLES WRITE,这一切都没有实际意义。
如果您使用 LOCK TABLES WRITE 锁定表,那么您对该表进行更改,它会调用触发器,并且在该触发器中,访问其他表。默认行为是其他表被锁定。
如果设置
innodb_table_locks=0
,则这些触发器访问的其他表不会被锁定。因此,如果其他会话在其他表中有一些行锁,这将有所帮助,因为您调用触发器的操作不必等待表锁。
另一方面,如果您的触发器代码依赖于对其他表的独占访问来避免竞争条件,那么您可能会破坏它,并获得难以调试的竞争条件。
如果您在正常使用表时不使用 LOCK TABLES WRITE,这一切都没有实际意义。