数据库 --事务的四大特征及隔离级别
一、什么是事务
事务是逻辑上的一组操作,一个事务中的一系列的操作要么全部成功,否则一个都不做。
举例:银行转账 -- 张三、李四各有1000元,张三向李四转账100元,张三账户-100元,李四账户+100元,两个操作要么都成功,要么都失败。
二、事务的四大特征(ACID)

1、原子性(Atomicity)
事务的所有操作,要么全部成功,要么全部失败,不可能停滞在中间环节。事务在执行过程中如果发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency)
事务开始前和结束后,数据库的完整性约束没有被破坏 。比如张三向李四转账100元,不可能张三扣了钱,李四却没收到。
3、隔离性(Isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、持久性(Durability)
事务完成后,事务对数据库的所有更新将被永久保存到数据库,不能回滚。
三、在事务的高并发中可能产生的问题
1、脏读:读取了未提交的事务数据,然后被回滚了。
-- 由于数据未提交,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读取到了并一定最终存在的数据,这就是脏读。
2、不可重复读:读取了提交的新事务(由更新操作引起)
-- 在一个事务内,由于其他事务对数据进行了一些更新(update),最开始读到的数据和事务结束前的任意时刻读到的同一批数据不一致。
3、幻读:读取了提交的新事务(由插入、删除操作引起)
-- 对数据库中的某个数据,a事务内多次查询却返回了不同的数据。这是由于在查询的间隔期间,b事务对该数据做了插入(insert)、删除(delete)的操作并提交,a事务在在后面的查询中发现多了一些原本不存在的记录(或者少了一些原本存在的记录),就好像发生了幻觉一样,所以称为幻读。
不可重复度和幻读区别:都是前后读取到的数据不一致,但不可重复读的重点是修改,幻读的重点在于插入、删除。
4、第一类数据丢失(回滚丢失)
-- a、b事务同时操作同一数据,a在操作期间,b事务进行提交且成功,最后a事务回滚了,这样b的事务操作就会因为a事务的回滚而丢失。
5、第二类数据丢失(提交覆盖)
-- a、b事务同时操作同一数据,二者同时获取到数据,b事务先提交,然后a事务也提交,最后覆盖了b事务的提交。
四、事物的隔离级别
事务的隔离级别是为了解决脏读、不可重复读、幻读这几个问题, 4 种隔离级别对这三个问题的解决程度:
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 读未提交(read-uncommitted) | 是 | 是 | 是 |
| 不可重复读(read-committed) | 否 | 是 | 是 |
| 可重复读(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 |
否 |
1、读未提交(read-uncommitted)
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
2、不可重复读(read-committed)
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
3、可重复读(repeatable-read)
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
4、串行化(serializable)
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

浙公网安备 33010602011771号