事物之隔离性详解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jjkang_/article/details/54925479

概念:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的失去,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

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

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

1、脏读:是指一个事务读取了另一个事务没有提交的数据。

假如A和B各自有100元钱,A向B转了100元钱,执行update account set money=money+100 while name=‘b’;update account set money=money-100 while name=‘a’;当第一条执行完,第二条还没执行,B查询自己的账户,就会发现自己的账户多了100元,如果此时A再回滚自己的操作,那么B之后再查询自己的账户,就会发现自己的钱和之前并没有变化,还是100


2、不可重复读

在一个事务内读取表中的某一行数据,多次读取结果不相同。

还是上面那个例子,转账之前,银行查询A的账户是100元钱,A向B转了100之后,银行 对应上面两个sql语句并且已经提交,又查询A账户,发现是0元。这就导致了两次查询结果不相同。

注意:不可重复读有时候是正确的,就像这种情况,正是实际情况需要的,然而有时,不可重复读是不正确的,比如对某个地区统计GDP,两次查询结果不一样,该怎么报道呢?所以这种情况又是错误的。

不可重复读和脏读的区别,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已经提交的数据。


3、虚读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

假如一个人存款100元没有提交,这时银行做报表统计所有用户的总额为600元,然后这个人提交了这时银行再统计发现账户为700元了,这就是虚读。


说了问题,那么怎么避免这些问题呢?请看我另一篇博客

展开阅读全文

没有更多推荐了,返回首页