Innodb implementiert zwei Sperren auf Zeilenebene, eine ist eine gemeinsame Sperre und die andere ist eine exklusive Sperre.
Entschuldigung:
(1) Können Sperren auf Zeilenebene nur auf Zeilendatensätze geladen werden? Warum wird in manchen Fällen erwähnt, dass gemeinsame Sperren und exklusive Sperren auch auf Tabellenebene verwendet werden können?
Kannst du mir ein paar Tipps geben?
InnoDB的行锁只在锁语句(也就是FOR UPDATE和LOCK IN SHARE MODE)使用到索引时才有效,因为InnoDB锁的其实是根据索引锁住行的。也就是说,如果没有使用索引,锁就会自动提升到表级别。
如果楼上所说,在事物隔离级别为repeat read下(mysql默认级别)
InnoDB引擎在修改删除数据时,会先查找到对应的索引,索引都是排序了的,所以会锁住某个值或者某个范围。
如果这个范围是整个索引段,那么则整个表数据均会被锁住;另外没有索引,在做修改删除操作的时候会全表扫描数据,自然也会锁全表。
InnoDB实现了以下两种类型的行锁。
共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。
另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
行锁是加在行上的,表锁就是对应整个表。行锁和表锁是可以共存的!
锁是mysql引擎都有的。行锁和表锁是在锁粒度的角度上区分的