| name | X 锁 | S 锁 |
|---|---|---|
| X 锁 | 冲突 | 冲突 |
| S 锁 | 冲突 | 不冲突 |
对于普通的 select 语句。innodb 不会加任何锁
将查找到的数据加上一个s锁,允许其他事务继续获取这些记录的 s 锁,不能获取这些记录的x锁(会阻塞)
使用场景:读取数据后,其他事务不能修改,但是自己也不一定能修改,因为其他事务也可以使用 select ... lock in share mode 继续加读锁。
将查找到的数据加上一个X锁,不允许其他事务获取这些记录的X锁和S锁
使用场景:读取数据后,其他事务既不能写,也不能加读锁,那么就导致只有自己可以修改数据。
如果被更新的列,修改前后导致存储空间发生了变化,那么会先给记录加X锁,然后将记录删除掉,再insert一条新记录。
隐式锁:一个事务插入一条记录后,还未提交,这条记录会保存本次事务id,而其他事务如果想来对这个记录加锁时会发生事务 id 不对应,这时会产生 X 锁,所以相当于在插入一条记录时,隐式的给这条记录加了一把隐式 X 锁。

