事务的特性以及隔离级别

一、事务的四大特性:

1.原子性(Atomicity):事务操作的集合是一个整体,不可能出现一部分成功,一部分失败。

2.一致性(Consistency):一个事务执行之前和执行之后,数据库都必须处于一致性状态。举例:A有1000元,B有0元,A、B此时共有1000元;接下来A借B 500元,此时A有500元,B有500元,A、B共有1000元,前后总钱数保持一致性。

3.隔离性(Isolation):彼此并行的事务,相互之间不能干扰。

4.持久性(Durability):事务一旦被提交,对数据库的影响时永久性的。

二、并行的事务可能引发的问题:

为什么要有事务的隔离级别?如果并行的事务,不去考虑它的隔离性,会引发很多问题,比如数据的脏读不可重复读幻读,而事务的隔离级别就是为了解决这些问题。那么什么是脏读、不可重复读、幻读呢?这里先简单说一下它的定义,具体细节展示与事务的隔离级别一同说明。 

1.脏读:一个事务读取到另一个事务未提交的数据。   

2.不可重复读:在同一个事务中,重复执行相同的sql,查询到的结果却不相同。

3.幻读:当某个事务读取范围内的数据时,另一个事务在该范围内插入数据,之前的事务再次读取范围内的数据时,会引发幻读。解释一下:例如在一个事务A中,执行查询,得到的结果集是10条,此时另一个事务B恰好执行了插入操作,事务A再次去查询的时候,却发现结果集有11条,貌似出现幻觉。                                           

三、事务的隔离级别:

事务的隔离级别大致分为四个等级,Read uncommitted(读未提交)Read committed(读已提交)Repeatable read(可重复读)Serializable(串行化),接下来对这四个隔离级别进行解释,并且说明他们分别解决了什么样的问题?(脏读、不可重复读、幻读)

1.Read uncommitted

该隔离级别在字面上的意思就是读取未提交,如果将数据库的隔离级别设为此,就可能引发脏读、不可重复读、幻读的问题。接下来就模拟一下数据库将隔离级别设为此等级,所引发的脏读。首先打开2个cmd窗口,登陆mysql数据库,这两个窗口的作用是一个模拟事务A,一个模拟事务B。然后将当前两个会话的隔离级别设置为Read uncommitted,具体操作:

(1)A窗口首先设置隔离级别为Read uncommitted,然后开启事务,并且查询表bank_account

(2)B窗口同样设置隔离级别为Read uncommitted,开启事务,做money的更新操作,但是并没有提交事务

(3)此时A窗口模拟的事务再次查询表,发现钱数少了,读到了B还没有提交的事务,数据出现脏读

总结:Read uncommitted(读未提交),这一隔离级别较低,会引发脏读问题,实际开发过程中要保证数据的正确性和安全性,一般不会使用此隔离级别。

2.Read committed

字面意思,读到已经提交的数据。这一隔离级别的等级较Read uncommitted要高,不会引发脏读的问题,但是它会引发数据的不可重复读问题,具体解释直接用例子来说明。

(1)A窗口设置隔离级别为Read committed,开启事务,查询表

(2)B窗口设置隔离级别为Read committed,开启事务,做money的更新操作,注意仍然没有提交事务

(3)A窗口再次查询表,发现钱数还是1000,并没有读取到B窗口未提交的数据,说明该隔离级别解决了脏读的问题

(4)那么不可重复读的问题是怎么出现的呢?接下来让B窗口提交事务,A再次查询表的时候就会发现,money的钱数减少了,同样的sql,查询的结果却不同,这就出现了不可重复读的问题

总结:Read committed(读已提交),这一隔离级别虽然解决了脏读的问题,但是却避免不了不可重复读的问题。

3.Repeatable read

字面意思,可重复读。这也是mysql数据库默认的事务隔离级别,可以使用如下的sql语句查看当前数据库的默认隔离级别:select @@tx_isolation;要说的是,这一隔离级别能够解决脏读、不可重复读的问题,但是无法解决幻读的问题。具体还是使用例子说明。

(1)A窗口设置隔离级别为Repeatable read,开启事务,查询表

(2)B窗口设置隔离级别为Repeatable read,开始事务,做money的更新操作,并且提交了事务(注意)

(3)A窗口再次查询表,发现两次查询的结果相同,没有出现查询结果不一致发的问题。说明Repeatable read这一隔离级别避免了不可重复读。

(4)只有当A也提交事务,才能够看见数据的变化

(5)以上例子只能够说明Repeatable read(可重复读)这一隔离级别能够解决脏读、幻读的问题,但是却不能够很好的模拟幻读的出现,那么幻读是什么样子呢?接下来在上面的基础之上模拟一下。让B窗口新增一条数据,并提交它的事务

(6)A窗口再次查询,发现原来总共两条数据,突然变成了三条,幻读出现

4.Serializable

这一隔离级别是安全性最高的,能够解决脏读、不可重读读、幻读等问题,但是过于安全,性能方面就略差一点。

四、图解隔离级别以及对应解决的问题

待补充。。。

 

本文参考博客:https://www.cnblogs.com/snsdzjlz320/p/5761387.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值