# 事务
事务就是一系列操作合在一起的集合,这个集合要满足ACID四个属性
- 原子性(Atomicity): 这一系列操作,必须看成一个整体,要么全做完,要么全恢复原状,不能做一半放下
- 一致性(Consistency):A减少50给B增加50,A和B的值都要变化,只能只变一个
- 隔离性(Isolation):每个事务都是独立的,不互相影响
- 持久性(Durability):事务提交了,数据就要存下来了
# 并发时产生的问题
- 脏读:事务B未提交的数据,被A读取到了,如果事务B回滚了,那么A读的这个就算脏数据了
- 不可重复读: 每次读的都不一样,事务A要多次读一条数据,结果第二次读的时候,这条数据被事务B给修改并提交了,那么事务A两次读取的就不一致
- 幻读:事务A在批量更新数据时,事务B又插入了一条并提交,这个时候A就会发现自己少更新了一条,以为是自己产生幻觉
# Mysql隔离级别
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(read-uncommitted) | √ | √ | √ |
| 不可重复读(read-committed) | √ | √ | |
| 可重复读(repeatable-read) | √ | ||
| 串行化(serializable) |
1、串行化虽然很好,但是效率最低,Mysql默认使用的是可重复读(repeatable-read)
2、实际上Mysql的可重复读(repeatable-read) 使用了MVCC机制(具体可百度,原理比较复杂),可以最大程度的解决幻读问题,所以一般用默认的没什么毛病
← 表锁、页锁、行锁