脏读的问题
窗口1
–查询账户表 select from account;
–设置隔离级别为read uncommitted
set global transaction isolation leve7 read uncommitted;
–开启事务
start transaction;
–转账
update account set money = money - 5o0 where id = 1;update account set money = money + 500 where id = 2;
–窗口2查询转账结果,出现脏读(查询到其他事务未提交的数据)
–窗口2查看转账结果后,执行回滚
ro17back;
窗口2
–查询隔离级别
SELECT aGtransaction_isolation;
–开启事务
start tr ansaction;
–查询账户表
select from account;
- 解决脏读的问题和演示不可重复读的问题
窗口1
–设置隔离级别为read committed
set global transaction isolation level read committed;
–开启事务
start tr ansaction;
–转账
update account set money = money - 5o0 where id = l;update account set money = money + 500 where id = 2;
–窗口2查看转账结果,并没有发生变化(脏读问题被解决了)
-―执行提交事务。
commit;
–窗口2查看转账结果,数据发生了变化(出现了不可重复读的问题,读取到其他事务已提交的数据)
窗口2
–查询隔离级别
SELECT @@transaction_iso1ation;
–开启事务
start transaction;
–查询账户表
select from account;
- 解决不可重复的
窗口1
–设置隔离级别为repeatable read
set global transaction isolation level repeatable read;
–开启事务
start tr ansaction;
-―转账
update account set money = money - 500 where id = i;update account set money = money + 500 where id = 2;
–窗口2查看转账结果,并没有发生变化
–执行提交事务
commit;
–这个时候窗口2只要还在上次事务中,看到的结果都是相同的。只有窗口2结束事务,才能看到变化(不可重复读的问题被解决)
窗口2
–查询隔离级别
SELECT @@transaction_iso1ation;
–开启事务
start tr ansaction;
–查询账户表
select from account;
–提交事务
commit;
–查询账户表
select from account;
- 幻读的问题和解决
窗口1
–设置隔离级别为repeatable read
set global transaction isolation level repeatable rea
–开启事务
start transaction;
–添加—条记录
工NSERT INTO account VALUES (3,‘王五’,1500) ;
–查询账户表,本窗口可以查看到id为3的结果
SELECT FROMaccount;
–提交事务
COMMIT;
窗口2
–查询隔离级别
SELECT a@transaction_isolation;
–开启事务
start transaction;
–查询账户表,查询不到新添加的id为3的记录select * from account;
–添加id为3的—条数据,发现添加失败。出现了幻读INSERT INTO account VALUES (3,'测试’,200);
–提交事务
COMMIT;
–查询账户表,查询到了新添加的id为3的记录select *from account;
select from account;
-解决幻读问题
窗口1
–设置隔离级别为seria7izab1e
set global transaction iso1ation level serializable;
–开启事务
start transaction;
–添加—条记录
INSERT INTO account VALUES (4,‘赵六’,1600) ;
–查询账户表,本窗口可以查看到id为4的结果
SELECT FROM account;
–提交事务
COMMIT;
窗口2
–查询隔离级别
SELECT @@transaction_iso1ation;
–开启事务
start tr ansaction;
–查询账户表,发现查询语句无法执行,数据表被锁住!只有窗口1提交事务后,才可以继续操作select from account;
–添加id为4的一条数据,发现已经存在了,就不会再添加了!幻读的问题被解决工NSERT INTO account VALUES (4,‘测试’,200);
–提交事务
COMMIT;