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


    数据并发产生的问题

    脏写: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 :保证所有的情况不会发生(锁表)。

  • 相关阅读:
    Flink基于时间窗口定时输出到ElasticSearch中并做到真正不丢数据
    北理工嵩天Python语言程序设计笔记(2 Python基本语法元素)
    python自动化测试中装饰器@unpack、@json_file和@yaml_file源码解析和使用
    在Linux中进行GO语言安装
    Python 5个必会小技巧
    树与二叉树(考研版)
    一个单身狗 和 两个单身狗
    Echarts 实现X轴多维效果
    测试过程中印象最深刻的bug?| 万能回答必杀技
    聚焦网安周 | 从技术框架到方案落地,全息网御探索数据安全实践的进化之路
  • 原文地址:https://blog.csdn.net/qq_51066068/article/details/125598893