Mysql X锁,S锁、间隙锁、死锁
InnoDB行锁加在索引项上,where条件未使用索引时用表锁。S共享锁由lock in share mode添加,X排他锁由for update以及update、insert、delete默认添加。RR级别默认使用Next-Key锁锁住记录及其间隙:唯一索引等值命中退化为记录锁,索引查询无匹配退化为间隙锁。间隙锁用于防止幻读和间隙内插入数据,辅助索引上的锁最终都要回溯到主键上再加锁。
- InnoDB行锁针对索引加锁,检索未用索引或扫描大半数据时升级表锁
- lock in share mode加S锁,for update加X锁并阻塞其他锁申请
- 意向锁IS、IX是表级标志,用于快速判断表中是否有记录被上锁
- 唯一索引等值查询命中退化为记录锁,索引查询无匹配退化为间隙锁
- select默认不加锁,间隙锁可防止幻读和间隙内新数据插入
凯哥强烈推荐mysql事务相关文章:
1,Mysql X锁和S锁。
1)概念:利用数据库本身提供的锁机制(行级锁)来实现,锁定该行数据。
trx_rows_locked:事务锁住的行数(不是准确数字)。Approximate number or rows locked by this transaction. The value might include delete-marked rows that are physically present but not visible to the transaction.

2)InnoDB的锁trx_tables_locked是行锁。『trx_tables_locked: 1』 are row locks,the tables can usually still be read from and written to by multiple transactions, despite some rows being locked。
InnoDB的行锁是针对索引加的锁。只有在通过where检索条件使用索引时,才使用行级锁,否则使用表锁!
3)for update排他锁没有线程对该结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞。select * from account where id > 8 and id <> 10 for update;(会对查询结果集中每行数据都添加排他锁)


经测试,id=8的数据在另一事务中可以正常更新,repeatable read模式下由于间隙锁的存在:当插入id = 13的数据时,会block等待锁。lock_data:上界虚记录supremum pseudo-record
4)mysql表锁InnoDB行锁是通过给索引上的索引项加锁来实现的,通过索引条件检索使用行锁,否则使用表锁。
当使用update、insert、delete、select… for update时,如果没有指定索引,则InnoDB使用表锁。


5)select ... lock in share mode。
为查询语句涉及到的数据加上共享锁,阻塞其他事务修改真实数据。
6)共享锁和排他锁。
共享锁(读锁S锁):一
原创不易,完成人机校验,阅读全文
常见问题
select for update会对数据加什么锁?
会对查询结果集中每行添加X排他锁,其他事务无法对这些行加任何锁或修改数据;在repeatable read级别下还会配合间隙锁或Next-Key锁锁定查询范围。
InnoDB行锁在什么情况下会变成表锁?
InnoDB行锁加在索引项上,当update、insert、delete或select for update的检索条件没有使用索引,或需要扫描表中大多数数据时,将使用表锁。