1.事务的四大特征(ACID)
原子性(Atomicity)
- 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
- 因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性(Consistency)
- 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- 也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性(Isolcation)
- 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务。
- 不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
- 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
- 即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
- 若不考虑隔离性会产生以下读问题:
- 脏读 :一个事务读取到另外一个事务未提交的脏数据.
- 不可重复读:在一个事务中,两次读取某条记录的信息不一致.针对的是记录的更新操作
- 虚读(幻读):在一个事务中.两次统计的数据不一致,针对的记录的增删操作.
| 问题 | 现象 |
|---|---|
| 脏读 | 在一个事务处理过程中读取到了另一个未提交事务中的数据 , 导致两次查询结果不一致 |
| 不可重复读 | 在一个事务处理过程中读取到了另一个事务中修改并已提交的数据, 导致两次查询结果不一致 |
| 幻读 | 查询某数据不存在,准备插入此记录,但执行插入时发现此记录已存在,无法插入。或查询数据不存在执行删除操作,却发现删除成功 |
2.事务隔离级别(面试题)
- 事务的隔离级别
| 级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
|---|---|---|---|---|---|---|
| 1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
| 2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle和SQL Server |
| 3 | 可重复读 | repeatable read | 否 | 否 | 是 | MySQL(已经避免了幻读) |
| 4 | 串行化 | serializable | 否 | 否 | 否 |
注意:隔离级别从小到大安全性越来越高,但是效率越来越低,所以不建议修改数据库默认的隔离级别。
