• mysql数据库的四种隔离级别


    mysql 事务的四大特性

    原子性(atomicity):强调事务的不可分割

    一致性(consistency):事务的执行的前后数据的完整性保持一致

    隔离性(isolation):一个事务执行的过程中,不应该受到其他事务的干扰

    持久性(durability):事务一旦结束,数据就持久到数据库

    mysql有四种隔离级别

    一,读未提交(read uncommitted)

    二,读已提交(read committed)

    三,可重复读(repeatable read)mysql默认的隔离级别

    四,串行化(serializable)

    一,读未提交

      你在修改表中数据的时候,你可以看到另一个人没有提交的数据。这是一种安全级别最低的隔离级别,目前这种级别只是理论存在,因为目前基本没有数据库采用这种隔离方式,这种隔离级别会产生的问题就是dirty read(脏读)

    二,读已提交(rc)

      很好理解,假如此时,你和另外一个人同时操作同一张表,有一条数据是id为1 姓名为小明的数据,此时另外一个人对这个数据修改为id为2 姓名为小红(没有提交前),你再次查询得到的数据一直都是1 小明,而当这个人修改完后输入commit提交后,此时你在查询时,数据则会变为2 小红,这就是读已提交,意思其实和字面意思一样,只能读取当已提交的数据。这个隔离级别解决了脏读的问题,但是缺点就是不可重复读

    三 可重复读(rr)

      这是mysql的默认隔离级别,与第二种不同的是,此时如果和你操作一张表的另一个人commit后,你select查询后依旧是1 小明,只有当你自己commit之后,当前事务完全结束后,你才可以看到修改后的值,这种隔离级别解决了不可重复读的问题,但是出现了一种新的问题,就是幻读,什么是幻读呢?举个例子,当你查询某条数据时,可能显示的是1 小明,但是此时可能有个人正好修改好了这条数据,当你提交后再次查询时,你会发现变成了2 小红,这个时候你可能会觉得不对啊,刚才我刚查询的时候明明不是2 小红啊,明明是1小明啊,是我产生幻觉了吗?这就是幻读。

            示例:事务中高并发更新用户金额的时候会发现金额和预期的结果不一致,这个时候可以使用 select for update 语句排他锁让隔离级别达到读已提交的效果。

            for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。 Select for update使用详解 - 知乎       

    四 序列化

      最安全的默认隔离级别,但是并不支持并发,相当于单线程,不允许并发操作数据库,事务开启后,只允许一个人进行操作,直到提交后下一个人才可以进入。

  • 相关阅读:
    使用bat脚本以json格式导出mongo数据库中指定表数据
    python目录树生成器
    react+vite配置module.scss(css in js)
    【C++模块实现】| 【06】日志模块添加循环覆盖写文件功能
    DolphinDB 四大因子库合集
    STM32定时器篇——通用定时器的使用(定时中断,PWM输出)
    HDBaseT是什么协议?与SDI和HDMI比较有哪些区别?
    无论是异常监控还是业务监控,通通搞定
    2023-11-08:用go语言,字符串哈希原理和实现 比如p = 233, 也就是课上说的选择的质数进制 “ 3 1 2 5 6 ...“ 0 1 2 3 4 hash[0] = 3 * p的0
    Andorid11系统自带Dialer不是默认应用
  • 原文地址:https://blog.csdn.net/a1053765496/article/details/127700050