锁分类
1.行锁
加锁的力度小,InnDB支持
- 共享锁:又称读锁。多个事务可以通过同一把锁访问数据,但是只能读不能修改数据。
- 排他锁:又称写锁。只有一个事务能获得该锁,其他事务都不能获得。innodb会对写操作自动加上排他锁。
- 自增锁;mysql中的自增字段。事务回滚不会使自增序列回滚。
常见的行锁算法:
user.userid(1,4,9)
- 记录锁:锁一条具体数据
- 间隙锁:在RR隔离级别下,会加间隙锁。锁住一个范围,而不是锁住具体数据,是为了防止幻读。
- 临键锁:间隙锁+右记录锁,形成一个左开右闭的区间范围。
2.表锁
加锁粒度大,MyISAM和InnDB都支持
- 表共享锁:类似行共享锁。
- 表排他锁:类似行排他锁。
- 意向锁:InnDB在添加行锁的时候会在表上自动添加意向锁。
3.全局锁
加锁之后整个数据库都处于只读状态,所有的写操作都会被挂起。一般用于数据库备份的时候。
数据的隔离级别
- 脏读:事务A读取到事务B未提交的数据
- 不可重复读:事务A读取到事务B已经修改的数据
- 幻读:事务A读取到事务B已经新增的数据
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
可串行化 | × | × | × |