为了解决并发事务的问题
    image.png

    查看事务隔离级别:
    SELECT @@TRANSACTION_ISOLATION;
    设置事务隔离级别:
    SET SESSION/GLOBAL TRANSACTION ISOLATION LEVEL{
    READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ |
    SERIALIZABLE
    }
    — 修改隔离级别:
    set session TRANSACTION ISOLATION LEVEL READ COMMITTED;

    注意:
    事务隔离级别越高,数据越安全,但是性能越低。
    在开发中,我们在选择事务的隔离级别的时候既要权衡数据的安全性,又要考虑效率

    模拟各个事务隔离级别下并发问题的:
    cmd打开两个客户端:
    连接数据库:mysql -hlocalhost -uroot -proot
    切换到指定数据库:use hp_mysql;
    image.png
    image.png
    ——————————————————验证不同隔离级别的脏读————————————————
    (1)READ UNCOMMITTED:
    设置隔离级别: set session TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    1.1 脏读
    1.1.1、两个窗口开启事务:start TRANSACTION;
    1.1.2、左窗口查询账户表:select from account;
    右窗口执行张三账户减少1000元的更新:
    update account set money=money-1000 where name=’张三’;
    左窗口再次查询账户表:select
    from account;
    image.png

    (2)READ COMMITTED :
    设置隔离级别: set session TRANSACTION ISOLATION LEVEL READ COMMITTED;
    2.1.1、两个窗口开启事务:start TRANSACTION;
    2.1.2、左窗口查询账户表:select from account;
    右窗口执行张三账户减少1000元的更新:
    update account set money=money-1000 where name=’张三’;
    左窗口再次查询账户表:select
    from account;
    image.png
    2.1.3、右窗口提交事务:commit
    左窗口再查询账户表:select * from account;
    image.png

    ——————————————————验证不同隔离级别的不可重复读————————————-
    READ COMMITTED会出现不可重复读(一个事物先后读取同一条记录,但两次读取的数据不同,成为不可重复度)
    1.两个窗口都开启事务:start transaction;
    左窗口查询账户表:select from account;
    右窗口更新数据:update account set money=money-1000 where name=’张三’;
    左窗口查询账户表:select
    from account;
    ———>发现左窗口两次查询的数据不同
    image.png
    为了解决不可重复读,只需要将事务隔离级别升到可重复读:REPEATABLE READ:
    设置隔离级别: set session TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    两个窗口都开启事务:start transaction;
    左窗口查询账户表:select from account;
    右窗口更新数据:update account set money=money-1000 where name=’张三’;
    左窗口查询账户表:select
    from account;
    ———>两次查询的数据是一样的
    image.png
    —————————————————————————演示幻读:——————————————————————————
    两个窗口都开启事务:start transaction;
    左窗口查询账户表:select from account where id =3;
    右窗口插入数据:insert into account(id,name,money) values(3,’张飞’,3000); commit;
    左窗口查询账户表:insert into account(id,name,money) values(3,’张飞有点黑’,3000);
    左窗口查询账户表任然没有:select
    from account where id =3;
    image.png

    为了解决幻读,只需要将隔离级别升到SERIALIZABLE
    设置隔离级别: set session TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    两个窗口都开启事务:start transaction;
    左窗口查询账户表:select * from account where id =5;
    右窗口插入数据:insert into account(id,name,money) values(5,’张飞5’,3000);
    ———>右窗口光标停了(阻塞了),因为左窗口正在操作
    image.png
    左窗口插入数据:insert into account(id,name,money) values(5,’张飞5’,3000);
    右窗口报主键错误:因为左窗口插入了数据;
    image.png