• 【脏读、脏写、不可重复读、幻读】数据库数据并发产生的问题


    数据并发产生的问题

    脏写:A事务修改了未提交的B事务修改过的数据

    脏读:A事务读取到了未提交的B事务修改过的数据

    解决办法:
    方法1:事务隔离级别设置为:read committed。
    方法2:读取时加排它锁(select…for update),事务提交才会释放锁,修改时加共享锁(update …lock in share mode)。加排它锁后,不能对该条数据再加锁,能查询但不能更改数据。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享。
     

    不可重复读:A事务读取数据,B事务更新数据,A事务再次读的时候读取到了B事务更新过的数据(一个事务中两次查询同一数据的结果不通,原因可能是在两次查询过程中间插入了一个事务更新了原有数据。)

    方法1:事务隔离级别设置为Repeatable read。
    方法2:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。

    幻读:A事务从表中读取了一些行数据,B事务在该表中插入了一些新的行,A事务再次读取同一个表,发现多出几行。

    解决办法:
    方法1:事务隔离级别设置为serializable ,那么数据库就变成了单线程访问的数据库,导致性能降低很多。


    Isolation 属性一共支持五种事务设置,具体介绍如下:

    DEFAULT: 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .

    READ_UNCOMMITTED: 会读到未提交的数据, 出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )。

    READ_COMMITTED: 不会读到未提交的数据,会出现不可重复读、幻读问题(锁定正在读取的行)

    REPEATABLE_READ :会出幻读(锁定所读取的所有行)

    SERIALIZABLE :保证所有的情况不会发生(锁表)。

  • 相关阅读:
    从零学习 InfiniBand-network架构(七) ——IB协议中数据如何传输
    特殊功能寄存器
    大结局:奥特曼等人将加入微软
    【Go事】一眼看穿 Go 的集合和切片
    Kubernetes二进制搭建
    go install 出现 cannot use path@version syntax in GOPATH mode 的解决办法
    什么是跨域?及7种跨域解决方法
    PyCharm如何更换解析器为Anaconda,如何自己切换python环境
    Python语义分割与街景识别(3):数据集准备
    【C/C++】智能指针
  • 原文地址:https://blog.csdn.net/qq_51066068/article/details/125598893