• MYSQL--未提交(read uncommitted)、读已提交(read committed)和repeatable read(可重复读)


    一、read uncommitted(读未提交)--脏读(Dirty Read)

    读未提交的概念:允许一个事务可以看到其他事务未提交的修改。

    第一步,建account(账户)表,属性有id(编号)和balance(金额) 。

    第二步:

    (1)在原窗口调整隔离级别为read uncommitted。

     (2)打开新窗口,调整隔离级别为read uncommitted(未提交读)。

    第三步:

    (1)原窗口开启事务。

    (2)新窗口开启事务。

    第四步:

    (1)原窗口事务1查询account表。

     

    (2)新窗口事务2更新1号账户的钱,将钱加200,更新到1200。

     (3)在原窗口事务1验证,理论上read uncommitted(未提交读)模式下,虽然事务2未提交,但事务1可以读到事务1的更新值。结果验证如下,符合理论预期:

     

     第五步:

    (1)在窗口2中回滚:事务2的更新操作。

    (2)在窗口1中重新查询account表,理论上在事务2回滚后,事务1中查询会得到事务2回滚后的表。

    结果验证如下,符合结果预期:

    二、read committed(读已提交)

    读已提交的概念:允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。

    第一步:

    在之前的基础上,将事务2改为read committed(读已提交)模式。

     第二步:

    (1)在事务1中,更新账户1,将钱减两百,得800。

    理论上事务2此时,已经只能看到其他事务已经提交的修改,所有事务1的减操作,事务2看不到,所以在事务2中查询,账户1的钱仍然是1000。

     

     (2)在事务2中验证如下,符合结果预期:事务2只能看到其他事务已提交的内容,事务1尚未提交,因此在事务2中的账户1的钱仍然是1000。

     

    第三步:

    (1)在事务1中提交之前的账户1更新操作。

    理论上事务1提交操作后,事务2能看的到。所有再在事务2中查询,预期账户1的钱已变为800。

     

    (2)在事务2中重新查询account表。

    得到账户1的钱已经变为800,符合预期。

     

    三、repeatable read(可重复读)

    可重复读概念:确保如果在一个事务中执行两次相同的select语句,都能得到相同的结果,不管其他事务是否提交这些修改。

    第一步:

    (1)在之前的基础上,将事务2改为repeatable(可重复读)模式。

    (2)在事务2中开启事务。

     

    (3)在事务2中查询一次account表。

    使用select * from account;

    理论上事务2目前处于可重复读模式,无论其他事务怎么修改account表,后面再次执行该查询语句,结果应该和这次的一样。

     

    (2)第二步:

    (1)在事务1中插入账户3,初始的钱为1000。

    (2)在事务1使用select * from account;

    查询结果中出现了新增的账户记录。

     

    第三步:

    (1)返回事务2验证:

    在事务2中使用select * from account;

    事务2中的查询结果,没有事务1中新增的记录,成功验证:

    在同一事务和可重复读模式下,无论其他事务怎么修改,原事务中执行相同的查询语句,前后结果相同。

    第四步:

    二道验证,看事务1是否将之前新的记录插成功:

    在事务2中尝试插入账户3,钱为1000。

    运行结果表示:id为3的插入冲突,说明id为3的账户记录已经存在,也就是事务1的插入成功。

    该结果再次证明可重复读模式的功能,结论在上面的第三步。

     

     

     

  • 相关阅读:
    PowerBI开发:用自然语言来探索数据--Q&A
    Linux系统:基本命令
    Python+人工智能基础大纲
    uniapp uni.getLocation:fail 频繁调用会增加电量损耗
    vue3基本使用笔记(更新中)
    硬件开发笔记(十九):Altium Designer 21软件介绍和安装过程
    mysql 存储过程详解
    碰到一个用pip死活装不上模块的问题(ModuleNotFoundError: No module named ‘triton‘)
    【Java SE】重写和重载的区别
    【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透
  • 原文地址:https://blog.csdn.net/zhan_qian/article/details/126654414