事务隔离级别中脏读、不可重复读,幻读问题的解决

本文通过多个窗口交互演示了数据库事务的脏读、不可重复读和幻读问题,以及如何通过设置不同的隔离级别(读未提交、读已提交、可重复读、串行化)来解决这些问题。在脏读示例中,展示了未提交数据的可见性;不可重复读则涉及已提交数据的变化;幻读问题在添加新记录时体现,导致不同事务看到的不同结果。通过调整隔离级别,可以确保数据一致性与并发性能的平衡。
摘要由CSDN通过智能技术生成

脏读的问题

窗口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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值