Mysql中的锁
InnoDB解决隔离性的两种方式:
- MVCC 多版本并发控制,使用的是乐观锁的快照读
- LBCC 基于锁的并发控制,使用的是悲观锁的当前读
同MVCC一样,LBCC使用的锁也是为了解决Mysql中的并发事务的问题。MVCC解决快照读的问题。
LBCC
锁的分类
- 独占锁(x锁):select * from for update; update; delete;
- 共享锁(s锁):select * from lock in share mode;
- 意向锁(IX和IS表级锁):当事务在表内加行锁前,需要加上表级的意向锁。
锁的粒度
非InnoDB只有表锁,没有行锁。
- 行锁:只有在使用索引的时候才会加行锁,并且只加在索引项上。
- 表锁:S锁、X锁、IS锁、IX锁、元数据锁(DDL)、AUTO-INC锁(自增id中插入操作时)。
间隙锁(Gap Locks)
InnoDB会在加行锁的同时对相邻索引间加上间隙锁。配合MVCC防止幻读问题。
但是还是没有完全避免幻读
比如:一个事务两次加锁的当前读是可以避免幻读问题,但是如果该事务第一次没有加锁成功(即没有命中数据),则还是有可能发生幻读。
死锁
两个或者两个以上的事务,竞争资源,造成的阻塞现象。Mysql强制重启事务来解决死锁。