day08-MySQL事务( 二 )

3.事务的四种隔离级别

  • 事务隔离级别介绍
  1. 多个连接开启各自的事务,操作数据库中的数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据是的准确性 。
  2. 如果不考虑隔离性,可能会引发如下问题:
    • 脏读(dirty read):当一个事务读取另一个事务尚未提交的改变(delete,insert,update)时,产生脏读
    • 不可重复读(nonrepeatable read):同一个查询在同一事务中多次进行,由于其他已提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
    • 幻读(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事务

    文章插图
    此时在另一个连接(隔离级别为 读未提交)中,查询同一张表,可以看到在这个(隔离级别为 读未提交的)连接中,已经可以看到另一个事务中提交的数据
    即一个事务的操作影响了另一个事务的查询,这时候就发生了不可重复读和幻读

    经验总结扩展阅读