zoukankan      html  css  js  c++  java
  • 数据库中的脏读、幻读、不可重复读和事务的隔离级别

    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 ;
  • 相关阅读:
    041.PGSQL-pgsql常用命令-查看日志文件大小、数据目录、运行日志相关配置、当前lsn
    041.PGSQL-pgsql时间日期错误问题,原来是系统时间问题,使用远程的NTP时间服务器来提供时间的话,需要使用timedatectl设置将NTP时间同步开启。
    040.PGSQL-备份和恢复-增量备份-创建基础备份
    039.PGSQL-备份和恢复-增量备份-开启wal归档、并设置定时清理备份之后的wal文件
    037.PGSQL-事务 savepoint 保存点、rollback to 回滚
    硬件黑客之无线电安全 --- Proxmark3 RDV4 套件
    我有一个想法。。。
    硬件嘿客之嘿客仓库
    WPA GPU基准测试
    什么是家用路由器,带你重新认识一下
  • 原文地址:https://www.cnblogs.com/fancy-li/p/11638510.html
Copyright © 2011-2022 走看看