事务的特性:  原子性 一致性 持久性 隔离性 并发产生的错误: 

五、事务的隔离级别

  多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

5.1、事务不考虑隔离性可能会引发的问题  

  如果事务不考虑隔离性,可能会引发如下问题:

  1、脏读

脏读指一个事务读取了另外一个事务未提交的数据 这是非常危险的,假设A向B转帐100元,对应sql语句如下所示 1.update account set money=money+100 where name='B';     2.update account set money=money-100  where name='A';         当第1条sql执行完,第2条还没执行(A未提交时),如果此时B查询自己的帐户,就会发现自己多了100元钱。如果A等B走后再回滚,B就会损失100元。  

  2、不可重复读

   不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。   例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户内存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。   不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。   很多人认为这种情况就对了,无须困惑,当然是后面的为准。我们可以考虑这样一种情况,比如银行程序需要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。

  3、虚读(幻读)

   虚读(幻读)是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。   如丙存款100元未提交,这时银行做报表统计account表中所有用户的总额为500元,然后丙提交了,这时银行再统计发现帐户为600元了,造成虚读同样会使银行不知所措,到底以哪个为准。   隔离级别:  8-串行化 4-可重复读 2-可读已提交 1-可读未提交 事务的隔离级别(并发产生的错误) Mysql 第1张 事务的隔离级别(并发产生的错误) Mysql 第2张  
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄