day08-MySQL事务( 二 )

  • 幻读(phantom read):虚读,同一查询在同一事务中多次进行,由于其他已提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读
    • 事务隔离级别
    概念:MySQL隔离级别定义了事务与事务之间的隔离程度
    MySQL隔离级别(4种)脏读不可重复读幻读加锁读读未提交(readuncommitted)会出现会出现会出现不加锁读已提交(readcommitted)不会出现会出现会出现不加锁可重复读(repeatable read)不会出现不会出现不会出现不加锁可串行化(serializable)不会出现不会出现不会出现加锁可重复读实际上会发生幻读?
    3.1读未提交(readuncommitted)
    MySQL的事务隔离级别--案例
    我们举例一个案例来说明mysql的事务隔离级别 。以account表进行操作为例 。(id、name、money)
    day08-MySQL事务

    文章插图
    1. 开启两个mysql的控制台
    2. 查看当前mysql的隔离级别 , 均为可重复读
      mysql> select @@tx_isolation;+-----------------+| @@tx_isolation|+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.00 sec)
      day08-MySQL事务

      文章插图
    3. 将其中一个连接的隔离级别设置为 readuncommitted(读未提交)
      -- 把其中一个控制台的隔离级别设置为read uncommittedSET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
      day08-MySQL事务

      文章插图
      此时的情况:左边的隔离级别为读未提交;右边的隔离级别为可重复读
      day08-MySQL事务

      文章插图
    4. 然后两边都开启事务
      day08-MySQL事务

      文章插图
    5. 在两个连接控制台中选择数据库,在隔离级别为 可重复读 的连接中 创建表account
      day08-MySQL事务

      文章插图
    6. 再在隔离级别为 可重复读 的连接中插入一条数据(但未提交)
      day08-MySQL事务

      文章插图
      在另一个连接(隔离级别为 读未提交 READ-UNCOMMITTED)中查询该表,发现可以查询到另一事务尚未提交的插入的数据,这时就发生了脏读
      脏读:当一个事务读取另一个事务尚未提交的改变(delete,insert,update)时,产生脏读

    day08-MySQL事务

    文章插图
    1. 在隔离级别为 可重复读 的连接中更新一条数据,同时插入一条数据,然后提交commit
      day08-MySQL事务

      文章插图
      此时在另一个连接(隔离级别为 读未提交)中 , 查询同一张表,可以看到在这个(隔离级别为 读未提交的)连接中,已经可以看到另一个事务中提交的数据
      即一个事务的操作影响了另一个事务的查询 , 这时候就发生了不可重复读和幻读
      这将会导致,当有多个连接开启事务时,某一连接的事务的查询会受到其他所有连接的事务的影响,这无疑将会导致混乱
      最佳情况应该是:一个连接 连接到数据库,操作account表的时候,希望看到的数据应该是 , 开启事务的这一时刻的数据

      day08-MySQL事务

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

    day08-MySQL事务

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

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

    day08-MySQL事务

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

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

      推荐阅读