zoukankan      html  css  js  c++  java
  • 如何避免事务的并发问题?

    通过设置事务的隔离级别
    v代表未解决,x代表已解决


                              脏读          不可重复读       幻读
                              
        1、READ UNCOMMITTED     √            √               √
        
        2、READ COMMITTED       x             √               √
        
        3、REPEATABLE READ      x            x               √                  
        
        4、SERIALIZABLE(串行化) x            x            x

    详解:

    Read uncommitted

    A事务可以读取未提交事务B的数据

    会出现的问题:

    脏读: B事物修改数据a=1,但是没有提交,A事物读取数据a=1,A事物拿到数据后显示,此时B事物回滚,再次修改数据a=2,然后提交,所以实际数据a=2,但是A事物拿到的是a=1.

    Read committed

    A事务要等B事务提交后才能读取数据

    会出现的问题:

    不可重复读:A事物读取a=1,A事物再次读取a,此时B事物修改了a=2, A事物等待B提交后读取a,此时a=2,一个事务范围内两个相同的查询却返回了不同数据.

    Repeatable read

    重复读,就是在A事物开始读取数据(事务开启)时,B事物不被允许修改操作(修改对应的是UPDATE操作)

    A事物读取数据a=1, 此时B事物将不被允许修改数据a,直到A事物执行完毕,B事物才可以执行修改数据a.

    会出现的问题:

    幻读:A事物读取整个表的总金额a,由于Repeatable read对应的是update操作,所以insert新的数据时,两个事物可以同时进行,这会导致A事物再次查询时,数据a发生了变化.

    Serializable 序列化

    Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

    大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。

    Mysql的默认隔离级别是Repeatable read。

    参考:

    https://www.cnblogs.com/ubuntu1/p/8999403.html

  • 相关阅读:
    【刷题-LeetCode】204. Count Primes
    【刷题-LeetCode】205. Isomorphic Strings
    【刷题-LeetCode】207. Course Schedule
    剑指offer题解——找出数组中重复的数字
    关于c++中vector操作
    动态规划算法
    分治算法
    从零学python——组合数据类型
    从零学python—PyInstaller库的介绍
    从零学python——代码复用与函数递归
  • 原文地址:https://www.cnblogs.com/sea-stream/p/11297934.html
Copyright © 2011-2022 走看看