• 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使用详解 - 知乎       

    四 序列化

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

  • 相关阅读:
    【数据结构与算法】万字顺序表与OJ题
    Flutter中TextField使用详情
    基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)
    Asp-Net-Core开发笔记:使用NPM和gulp管理前端静态文件
    C++简易Tensor实现
    【附源码】Python计算机毕业设计农村地产物品交易网站
    uniapp打包安卓后在安卓屏上实现开机自启动
    sourcetree 配置 gitlab ssh及公钥私钥设置
    MySQL数据库(一)
    借助 DevChat AI 之力,成就我之全栈梦想
  • 原文地址:https://blog.csdn.net/a1053765496/article/details/127700050