• 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的插入成功。

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

     

     

     

  • 相关阅读:
    appium+jenkins实例构建
    MyBatis完成CRUD 详细细节内容
    强制用户使用定向推送功能是什么意思?整改措施请收好
    【5. 虚拟内存管理】
    R语言基操
    咖啡技术培训:6款创意咖啡拿铁教程
    人工智能前沿——2022年最流行的十大AI技术
    先进制造aps专题三 为什么java语言不适合作为aps算法的开发语言
    ROM是什么? 刷ROM是什么意思?
    计算机网络自学笔记004_Real(数据链路层002)
  • 原文地址:https://blog.csdn.net/zhan_qian/article/details/126654414