InnoDB 存储引擎
行锁
- 共享锁(S)
- 多个事务可以加共享锁读同一行数据,但是别的事务不能写改行
- 排他锁(X)
- 一个事务加排他锁写一行数据,其他事务只能读改行数据
- 共享锁和排他锁是互斥的
表锁
- 意向共享锁
- 意向排他锁
select 默认不会上锁
- 由于 innodb 实现了可重复度
- 只会基于 mvcc 机制,根据行的事务id进行判断
间隙锁
简介
使用范围条件检索数据,请求共享锁或排他锁时
范围条件检索数据时,会锁定整个范围内所有的索引键值,即使该键值不存在
- 锁定时,无法插入锁定键值范围内的任何数据
加入锁时机
行锁
共享锁
- innodb 不会主动 加共享锁
只能手动加共享锁(不要对某段数据加锁修改时),在
select
语句后面加lock in share mode
排他锁
insert
,update
,delete
, innodb 自动给对应的行加行级排他锁可以手动加排他锁, 在对应的 select、 insert、update、delete 加入
for update
加入行共享锁时,必须给表加意向共享锁
- 加入行排他锁时,必须给表加意向排他锁
- Innodb 存储引擎自动加
- 无索引行锁会升级为表锁
乐观锁和悲观锁
- 悲观锁
insert
,update
,delete
默认加行级排他锁- select 加
for update
- 可能导致死锁
- 乐观锁
- 用版本号字段,会进行版本号判断