day08-MySQL事务( 三 )


day08-MySQL事务

文章插图
  • 在隔离级别为可重复读的连接中更新一条数据
    day08-MySQL事务

    文章插图
    ? 然后在隔离级别为读已提交的连接中 插询表account,可以看到查询到的数据变成了其他连接的事务提交的 数据,说明,在隔离级别为读已提交下,出现了不可重复读和幻读
    day08-MySQL事务

    文章插图
  • 3.3可重复读(repeatable read)
    1. 重新开启两个连接,两个连接的隔离级别均为可重复读

    day08-MySQL事务

    文章插图
    1. 然后两边均开启事务

    day08-MySQL事务

    文章插图
    1. 在一个连接中选择数据库,然后在account表中插入一条数据,再更新一条数据(未提交)
      day08-MySQL事务

      文章插图
      此时该连接中的表情况为:
      day08-MySQL事务

      文章插图
      在另一个连接中选择数据库,查询表account , 可以看到查询到的表数据依旧是开启事务时的样子,没有受到其他事务的影响,即没有产生脏读
      day08-MySQL事务

      文章插图
    2. 在原先修改数据的连接中输入commit提交
      day08-MySQL事务

      文章插图
      在另一个连接中再查询表account , 可以看到数据依旧是开启事务的时刻的样子
      即,没有产生不可重复读和幻读
      day08-MySQL事务

      文章插图
    综上,隔离级别为可重复读的情况下 既不会出现脏读,也不会出现不可重复读和幻读
    3.4可串行化(serializable)
    1. 将上面两个连接其中一个重新启动,将新连接设置隔离级别为可串行化(serializable)
      day08-MySQL事务

      文章插图
      此时两个连接的隔离级别分别为 可重复读 和可串行化(serializable)
      day08-MySQL事务

      文章插图
    2. 这时分别在两个连接中均开启事务
      day08-MySQL事务

      文章插图
    3. 在隔离级别为可重复读的连接中分别插入、更新数据(未提交)
      day08-MySQL事务

      文章插图
      ? 在另一个隔离级别为可串行化的连接中选择数据库 。然后查询表account,回车时会发现卡住了,这是因为 可串行化会加锁
      A连接在操作表的时候,事务还没有结束,这时B连接也尝试操作该表,此时将会检查A的事务有没有结束 , 如果没有结束,B连接的操作就会进行等待 , 直到A连接的事务提交

      day08-MySQL事务

      文章插图
      ? 这时,在隔离级别为可重复读的连接中提交事务

    day08-MySQL事务

    文章插图
    ?可以看到可串行化级别的连接中可以成功操作表了
    ?
    day08-MySQL事务

    文章插图
    综上说明,可串行化级别下,不仅不会出现脏读、不可重复读、幻读 , 还会加锁读
    4.设置隔离【day08-MySQL事务】

    推荐阅读