
MySQL事务和锁总结
目录
- 事务ACID
- 事务并发问题
- 事务隔离级别
- 锁机制
- 乐观锁和悲观锁
- 共享锁(Shared,S锁,读锁)和排它锁(Exclusive,X锁,写锁)
- 表锁
- 行锁
- 间隙锁(Gap Lock)和临键锁(Next-key Locks)
-
- 意向锁
- select for update
事务ACID
- 原子性(Atomicity) :一个事务中的操作,要么全部成功,要么全部失败,可以通过undo log回滚。
- 一致性(Consistent) :在事务的前后,数据都必须保持一致状态。如果事务在执行过程中被中断,导致一部分更新已经入库,但是这部分数据没有回滚,就出现了数据不一致。可以简单理解为和原子性类似,只是原子性关注的是行为,而一致性关注的是数据。
- 隔离性(Isolation) :多个事务同时执行的时候,一个事务的执行不能影响到其他事务的执行,操作的数据也不能相互干扰。在SQL规范中定义了4个事务隔离级别,见后文。
- 持久性(Durable) :一旦事务完成,它对于数据的修改需要永久保存到数据库中,即使系统故障宕机,重启也要能够恢复,可以依赖redo log实现crash safe。
关于undo log、redo log等可以参考,MySQL–buffer pool、redo log、undo log、binlog
事务并发问题
- 脏读:一个事务A读取到了其它事务B未提交的更新数据,如果事务B对数据进行多次更新,那么之前读取的数据就是脏数据。同样的,如果事务B回滚,那么事务A读到的这个数据也是脏数据。
- 幻读:一个事务A读取到了其它事务B新增的数据,可能导致事务A使用同样的查询条件查询多次,得到不一样的结果条数,主要出现在insert操作中。
- 不可重复读:一个事务A对同一条数据进行多次读取,发现后面读取的数据和前面读取的数据不一致。
事务隔离级别
注:v代表能解决,x代表不能解决
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|
读未提交 | x | x | x |
读已提交 | v | x | x |
可重复读 | v | v | x |
串行化 | v | v | v |
MySQL默认的事务隔离级别是可重复读,另外,在InnoDB中,可重复读级别下,可以通过间隙锁