innodb 锁模式:
行锁:
共享锁(S):当一个事务读数据的时候,在相应的数据集上允许其他事务读,但是不允许写
排他锁(X):当一个更新数据的时候,在相应的数据集上阻止其他事务进行读写
表锁:
意向共享锁(IS): 事务准备给数据加上共享锁,一个数据加共享锁前必须先取得该表的IS锁
意向排他锁(IX): 事务准备给数据加上排他锁,一个数据加排他锁前必须先取得该表是IX锁
S | X | IS | IX | |
S | 兼容 | 冲突 | 兼容 | 冲突 |
X | 冲突 | 冲突 | 冲突 | 冲突 |
IS | 兼容 | 冲突 | 兼容 | 兼容 |
IX | 冲突 | 冲突 | 兼容 | 兼容 |
意向锁是innodb自动加的,不需要用户干预
对于insert,update,delete,innodb会自动给涉及的数据加排他锁(X);对与一般的select语句,innodb不会加任何锁,
可通过如下方式显示加共享锁或排他锁
共享锁:select .......................................lock in share mode
排他锁:select .......................................for update
锁的实现方式:
行级锁并不是直接锁记录,而是锁索引,根据where条件和select的值是否只有主键或非主键索引来判断怎么锁,比如只有主键,则锁主键索引,如果只有非主键,则锁非主键索引,如果主键非主键都有,则内部会按照顺序锁。只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。