day08-MySQL事务( 三 )


这将会导致,当有多个连接开启事务时,某一连接的事务的查询会受到其他所有连接的事务的影响,这无疑将会导致混乱

最佳情况应该是:一个连接 连接到数据库,操作account表的时候,希望看到的数据应该是,开启事务的这一时刻的数据

day08-MySQL事务

文章插图
  • 在连接(隔离级别为 读未提交)中提交commit结束一个事务,此时两个连接中的事务均已结束
  • 3.2读已提交(readcommitted)
    例子
    1. 在上个例子开启的两个连接中,将其中一个连接的隔离级别修改为 读已提交,

    day08-MySQL事务

    文章插图
    另一个保持隔离级别为可重复读
    day08-MySQL事务

    文章插图
    1. 两边都开启事务

    day08-MySQL事务

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

      文章插图
      然后在隔离级别为读已提交的连接中 插询表account,可以看到查询到的数据还是本连接开启事务时的数据
      即,读已提交的隔离级别不会出现脏读现象
      day08-MySQL事务

      文章插图
    2. 在隔离级别为可重复读的连接中更新一条数据
      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)

      经验总结扩展阅读