Mysql 多个客户端。在尝试在同一行上获得真正的锁之前,它们不一定会发生冲突
但是表锁(ALTER table、DROP table、lock TABLES)同时阻塞IS和IX,反之亦然 因此,IX锁与另一个IX锁兼容(它们都是表级)或IX锁与另一个X锁冲突(表级而非行级)Mysql 多个客户端。在尝试在同一行上获得真正的锁之前,它们不一定会发生冲突,mysql,locking,innodb,Mysql,Locking,Innodb,但是表锁(ALTER table、DROP table、lock TABLES)同时阻塞IS和IX,反之亦然 因此,IX锁与另一个IX锁兼容(它们都是表级)或IX锁与另一个X锁冲突(表级而非行级) 参考资料:Hello Bill,通过说“选择…更新不会被IX锁阻止”,然后如何解释选择。。。因为更新被另一个选择阻止。。。对于确实令人印象深刻的更新,它在等待X锁,但谁在上面设置了X?选择。。。对于仅更新,请询问IX lock right?否--SELECT…FOR UPDATE锁定索引扫描读取的行,
参考资料:Hello Bill,通过说“选择…更新不会被IX锁阻止”,然后如何解释选择。。。因为更新被另一个选择阻止。。。对于确实令人印象深刻的更新,它在等待X锁,但谁在上面设置了X?选择。。。对于仅更新,请询问IX lock right?否--
SELECT…FOR UPDATE
锁定索引扫描读取的行,就像您对这些行执行了UPDATE
或DELETE
语句一样。因此,请参见SELECT…FOR UPDATE
尝试创建X锁,如果这些行上已经存在其他X锁,则会被阻止。如果它获取了锁,它将阻止其他读取相同行的SELECT…FOR UPDATE
语句。再次感谢。这就是问题所在,也是我感到困惑的原因,因为根据mysql refmanual SELECT。。。对于已发布的更新IX而不是X,“例如,选择…共享模式下的锁设置IS锁,选择…更新设置IX锁。”参考:,此外,我怀疑它是X锁,因为X锁与共享锁冲突,所以当存在X锁时,您不能发出SELECT(不用于更新),事实是您可以选择(不用于更新)即使已经有了选择。。。对于UPDATEAwesome,IX锁是表级锁,我认为它是行级锁,你不仅应该得到50分,我希望我能提供更多,谢谢
X IX S IS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Compatible
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible
---TRANSACTION 71568, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics
select * from test where id=1 for update
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test`
trx id 71568 lock_mode X locks rec but not gap waiting