数据库事务隔离机制

参考

https://www.cnblogs.com/huanongying/p/7021555.html
https://blog.csdn.net/qq_44969643/article/details/115875681

一、事务的4个特性ACID

原子性(atomicity)

一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性

一致性(consistency)

事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。比如A向B转账,A扣了钱,则B必须相应的加钱。

隔离性(isolation)

事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。比如A正在取钱,B想向A转账,应该在A取完钱后,B再向A转账。

持久性(durability)

一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。–即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。

二、事务的并发问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

事务隔离级别

事务隔离级别一般有四个,读未提交、读已提交、可重复读、可串行化

隔离级别对性能的影响比较:可串行化>可重复读>读已提交>读未提交

读未提交级别下,会读取到未提交事务所更改的数据。

读已提交级别下,只会读取到事务更改后的数据,但是不能避免不可重复读。比如在一次事务中读取两次相同数据,如果读取完第一次数据后,提交了事务更改了数据,那么第二次读的时候,会出现两次读取不一致的情况。

可串行化,意味着,并发执行的结果与串行,即非并发执行的结果保持一致。

猜你喜欢

转载自blog.csdn.net/rglkt/article/details/122101115