# 事务

事务就是一系列操作合在一起的集合,这个集合要满足ACID四个属性

  1. 原子性(Atomicity): 这一系列操作,必须看成一个整体,要么全做完,要么全恢复原状,不能做一半放下
  2. 一致性(Consistency):A减少50给B增加50,A和B的值都要变化,只能只变一个
  3. 隔离性(Isolation):每个事务都是独立的,不互相影响
  4. 持久性(Durability):事务提交了,数据就要存下来了

# 并发时产生的问题

  1. 脏读:事务B未提交的数据,被A读取到了,如果事务B回滚了,那么A读的这个就算脏数据了
  2. 不可重复读: 每次读的都不一样,事务A要多次读一条数据,结果第二次读的时候,这条数据被事务B给修改并提交了,那么事务A两次读取的就不一致
  3. 幻读:事务A在批量更新数据时,事务B又插入了一条并提交,这个时候A就会发现自己少更新了一条,以为是自己产生幻觉

# Mysql隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

1、串行化虽然很好,但是效率最低,Mysql默认使用的是可重复读(repeatable-read)

2、实际上Mysql的可重复读(repeatable-read) 使用了MVCC机制(具体可百度,原理比较复杂),可以最大程度的解决幻读问题,所以一般用默认的没什么毛病