事务的概念
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
事务特性(ACID)
事务拥有四个重要的特性:
- 原子性(Atomicity)
事务开始后所有操作,要么全部完成,要么全部失败。在事务的执行过程中出现错误,会回滚到事务开始前的状态。 - 一致性(Consistency)
指事务将数据库从一种状态转变为另一种一致的状态。事务开始前和开始后,数据库的完整性没有被破坏。 - 隔离性(Isolation)
要求每个读写事务的对象对其他事务的操作对象能相互分离。即该事务提交前对其他事务不可见。
注:MySQL通过锁机制来保证事务的隔离性。 - 持久性(Durability)
事务一旦提交,则其结果就是永久性的。
注:MySQL使用 redo log 来保证事务的永久性。
脏读
一个事务读到了另一个未提交事务修改过的数据。例如,事务A读取了一条记录(id=1,name=“zhangsan”),然后将“zhangsan”改成了“lisi”,但是事务A还没有提交,此时另一个事务B到来并也读取了这一条记录,而读到的数据是(id=1,name=“lisi”)。如果事务A发生回滚,那么事务B读到的记录将是一个不存在的数据。这个现象称为脏读。
不可重复读
在一个事务内两次读取同一条记录时,得到的结果不一致。例如,事务A读取了一条记录(id=1,name=“zhangsan”),在事务A未结束之前,另一个事务B也读取了同一条记录(id=1,name=“zhangsan”),然后将“zhangsan”改成了“lisi”并且提交了修改,然后事务A再次读取这一条记录(id=1,name=“lisi”)时,发现前后两次读取到的记录不一致。这个现象称为不可重复读。
幻读
在一个事务内两次以相同的查询条件查询一些记录时,得到的记录条数不一致。例如,事务A以某个查询条件查询到了4条记录,在事务A未结束之前,事务B插入(或删除)了一条符合事务A查询条件的记录,然后事务A再以相同的条件查询时,得到的记录条数不一致。
事务的隔离级别
- READ UNCOMMITED(读未提交)
- READ COMMITED(读已提交)
- REPEATABLE READ(可重复读)
- SERIALIZABLE(可串行化)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
READ UNCOMMITED(读未提交) | √ | √ | √ |
READ COMMITED (读已提交) | × | √ | √ |
REPEATABLE READ(可重复读) | × | × | √ |
SERIALIZABLE(可串行化) | × | × | × |
注:√:会发生 ×:不会发生