MySQL事务与锁
MySQL事务
- 事务的特性
- 原子性
- 一致性
- 隔离性(四种隔离级别)
- 持久性
事务隔离级别及其并发问题
- Read uncommitted(读未提交)
- 事务中的修改即使没有提交,也会被其它事务可见;会导致脏读
- Read committed(读已提交)
- 事务从开始到提交之前,所有的修改对其它事务不可见;会导致不可重复读(事务A在多次读取同一数据的过程中,事务B对其修改并提交,会导致事务A多次读取同一数据时结果不一致)
- Repeatable read(可重复读)InnoDB默认 隔离级别
- 第一次读取到数据后,就将这些数据加锁(悲观锁),其它事务无法修改这些数据。由于没有对表进行加锁,仍会导致幻读(但可以通过其它手段解决幻读)
- serializable(可串行化)
- 强制事务串行执行,会锁住整张表
MySQL锁
-
乐观锁下的CAS(compare and swap)
通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于等于数据库表当前版本号,则予以更新,否则认为是过期数据 -
发生死锁的四个条件
- 互斥条件
- 请求和保持
- 不剥夺条件
- 环路等待条件
SQL优化和MVCC
略,待补充