数据库 / 事务的隔离级别

事务的隔离性确保了数据库操作的有序性,防止并发事务导致的数据不一致。脏读、不可重复读和幻读是并发操作常见的问题。事务隔离级别包括读未提交、读提交、重复读和序列化,每个级别对这些问题有不同的解决策略。更高的隔离级别虽然能更好地防止数据异常,但可能牺牲性能。

一、什么是事务的隔离性?

两个人同时在一个画本上画画,过程中你一笔我一笔,那么最后最后画出来的一定是一个四不像,多个事务同时操作一个数据也会和上面的情况类似,所以为了让不同的事务之间相互不存在干扰,就需要对事务的操作进行隔离,事务的隔离性也就是将操作同一个数据的事务相互分离,让操作之间分开有序的执行。

二、如果不对事务进行隔离会有哪些问题?

在数据库中,如果多个事务可以同时操作一个数据,那么就会产生脏读、重复读、幻读的问题。

1、脏读

出现原因:修改数据的同时可以读取数据。

案例: 以存款为例,假设 A 与 B 同用一张银行卡,银行卡内余额为 1000 。

操作: 如下图所示,当事务 B 对余额进行了修改但是未提交事务,此时事务 A 对银行卡余额进行读取,并且在这个数据的基础上进行业务操作,进行存款,结果会导致最终的银行卡余额出现问题 ;

2、不重复读

出现原因: 读取数据的同时可以进行修改;

案例: 以取款为例,假设 A 与 B 同用一张银行卡,银行卡内余额为1000。

操作: 如下图所示,事务 A ,事务 B 同时对余额进行访问,事务 A 对余额进行读取,事务 B 对余额进行修改,当事务 A 第一次对余额进行读取后,此时事务 B 提交,那么当事务 A 第二次读取该数据时的数据就与第一次读取的数据不同,这种情况称为可重复读;

3、幻读

出现原因:读取和修改的时候可以 insert 数据;

案例: 以打印银行卡账单存款记录为例,假设 A 与 B 同用一张银行卡,银行卡内存款记录为两条。

操作: 如下图所示,存款表有 2 条数据,A 对存款表进行读取, 当 A 第一次读取到存款记录的时候只有 2 条数据; 但是与此同时 B 往银行卡进行了一笔存款然后提交了事务,在 B 提交了存款事务之后,A 执行了打印操 作,最后发现打印存款表信息的时候却发现有 3 条数据,与之前查出的数据不一样,这种平白无故多出来 的数据就好象发生了幻觉一样所以称为幻读;


三、事务的四种级别

就像上面所说的,如果不对事务进行隔离那么势必就会产生很多问题,所以就需要一种机制来对不同事务间的操作进行隔离,让彼此之间相互不影响,数据库对事务隔离设置有四种程度的级别,分别为读未提交、读提交、重复读、序列化;级别依次从低倒高,级别越高事务的之间的隔离操作就越严格,当然要求越严格其性能也会越低。

1、READ_UNCOMMITTED(读未提交)

这种情况只限制了两个数据不能同时修改,但是修改数据的时候是可以读取的,这级别的事务隔离有脏读、重复读、幻读的问题;

2、READ_COMMITTED(读提交)

这种隔离级别的事务限制了修改数据的时候不允许读取,但是读取数据的时候是可以进行修改的,所以这种事务的隔离级别解决了脏读问题,但会存在重复读、幻读问题;

3、REPEATABLE_READ(重复读)

这种隔离级别的事务限制了读取数据的时候也不可以进行修改,所以解决了重复读的问题,但是读取范围数据的时候可以插入数据,所以还会存在幻读问题;

4、SERIALIZABLE (序列化)

事务最高隔离级别,在该级别下,所有事务都是进行串行化顺序执行,这样就可以避免脏读、不可重复读与幻读所有问题了。但是这种事务隔离级别下事务执行的效率低下,比较耗数据库性能。

转载于:https://zhuanlan.zhihu.com/p/27790194

(SAW:Game Over!)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值