• 事务的隔离级别


    一、隔离级别:

    数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别后三个可以逐个解决脏读、不可重复读、幻读这几类问题。

    二、举例说明脏读、不可重复读、幻读

    【1】脏读(读取未提交数据,然后被回滚了)

    A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。

    这种情况常发生于转账与取款操作中

    1   开始事务
    2 开始事务  
    3   查询账户余额为2000元
    4   取款1000元,余额被更改为1000元
    5 查询账户余额为1000元(产生脏读)  
    6   取款操作发生未知错误,事务回滚,余额变更为2000元
    7 转入2000元,余额被更改为3000元(脏读的1000+2000)  
    8 提交事务  
     备注 按照正确逻辑,此时账户余额应该为4000元

    【2】不可重复读(读取了提交的新事物,指更新操作)

    事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。

    1 开始事务  
    2 第一次查询,小明的年龄为20岁

     
    3   开始事务
    4 其他操作  
    5   更改小明的年龄为30岁
    6   提交事务
    7 第二次查询,小明的年龄为30岁  
    备注 按照正确逻辑,事务A前后两次读取到的数据应该一致

    【3】幻读(前后多次读取,数据总量不一致,也是读取了提交的新事物,指增删操作)

    事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。

    1 开始事务  
    2 第一次查询,数据总量为100条  
    3   开始事务
    4 其他操作  
    5   新增100条数据
    6   提交事务
    7 第二次查询,数据总量为200条  
    备注
    按照正确逻辑,事务A前后两次读取到的数据总量应该一致
  • 相关阅读:
    php_sphinx安装使用
    深入Web请求过程(笔记)
    php的单例模式
    解决rsync 同步auth failed on module问题
    生成shadow中hash字串
    python程序不支持中文
    xshell4无法使用小键盘问题解决
    LVS客户端启动脚本
    更改linux系统提示信息
    使用md5判断网站内容是否被篡改
  • 原文地址:https://www.cnblogs.com/wangqingming/p/10695851.html
Copyright © 2020-2023  润新知