数据库中的脏读、幻读、不可重复读和事务的隔离级别

1.数据脏读

事务a修改了某条数据,然后事务b读取了事务a修改的该条数据,然后事务a由于某些原因,事务a回滚了,这样事务b读到的数据就和回滚的数据不同了,这时事务b读取的数据就是脏数据。

概括来讲:就是一个事务读取了另一个事务未提交的数据。

2.数据幻读

事务a按一定条件读取了该表的一些数据,然后事务b想该表插入了一些满足事务a查询条件的数据,当事务a再次以相同条件查询数据时,会发现多出来一些数据,就好像产生了幻觉一样,我们称为幻读。

概括来讲,就是一个事物的两次查询,出现的查询数目不一致的情况。

3.不可重复读

事务a读取了某条数据,事务a没有提交,然后事务b修改了该条数据,这时事务a再次读取该条数据,这样两次读取的数据不同,我们成为该条数据为不可重复读。

概括来讲就是一个事务多次读取某条数据,发现读取的数据不完全相同。

注:不可重复读发生在更新数据的情况下,多次读出现数据不一致。幻读出现在删除或新增数据时,表现在同一查询条件,查出的数据数目不同。

 

4.更新丢失的情况:

a. 第一类更新丢失

A事务撤销时,把已经提交的B事务的数据更新丢失。

例:银行业务中,事务A,B同时操作同一账户数据 ,当账户有1000元时,事务A扣除100元,同时事务B同时执行,并在事务A结束之前完成了+500元的操作。而事务A此时由于某些原因回滚数据,余额回滚到1000元,事务B的更新操作被覆盖。

b.第二类更新丢失

A事务覆盖掉了B事务提交的数据,造成B事务的操作丢失。

例:银行业务中,事务A,B同时操作同一账户数据,事务A,B并发执行,但事务B先执行完。事务A的操作是存入500元,事务B的操作是取除500元,两事务都执行完毕后,余额变为1500元,即B事务的更新操作丢失。

5.解决方法

解决上述数据操作不一致的问题,数据库通过锁机制来解决。按锁对象来分分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁和独占锁。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,一般的insert update delete都会隐式采用必要的行锁定。基于锁机制,数据库面提供了4级事务隔离级别,用户只需要设置事务的隔离级别,就会分析事务的sql语句并自动选择合适的锁。值得注意的是,隔离级别越高,数据库的并发性能越差,即事务的隔离级别与数据库的并发性能成负相关关系。

隔离级别具体具体内容如下图所示:

Mysql 中设置数据库隔离级别的方法

--查询当前数据库的隔离级别
SELECT @@TX_ISOLATION
--设置对应的数据库隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL  READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE ;

 

posted @ 2019-10-08 23:04  fancy_li  阅读(390)  评论(0编辑  收藏  举报