事务是什么
事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败。
事务的四大特性
- 原子性(Atomicity)
- 事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
- 一致性(Consistency)
- 事务发生前和发生后,数据的完整性必须保持一致。
- 隔离性(Isolation)
- 当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。
- 持久性(Durability)
- 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过'补偿性事务'。
事务的开启
- 开启:begin
- 提交:commit
- 回滚:rollback
脏读 幻读 不可重复读
脏读:
所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,如下图:
- 如果会话 2 更新 age 为 10,但是在 commit 之前,会话 1 希望得到 age,那么会获得的值就是更新前的值。或者如果会话 2 更新了值但是执行了 rollback,而会话 1 拿到的仍是 10。这就是脏读。
不可重复读:
一个事务查询同一条记录2次,得到的结果不一致:
- 由于在读取中间变更了数据,所以会话 1 事务查询期间的得到的结果就不一样了。
幻读:
一个事务查询2次,得到的记录条数不一致:
- 幻读是不可重复读的一种特殊场景。
事务的隔离级别
MySQL 里有四个隔离级别:
- Read uncommttied(可以读取未提交数据)
- Read committed(可以读取已提交数据)
- Repeatable read(可重复读)
- Serializable(可串行化)
不同事务隔离级别有不同的效果:
在 InnoDB 中,默认为 Repeatable 级别,InnoDB 中使用一种被称为 next-key locking 的策略来避免幻读(phantom)现象的产生。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
参考文章: