|NO.Z.00038|——————————|BigDataEnd|——|Java&MySQL单表/约束/事务.V16|——|MySQL.v16|脏读演示及解决|
一、脏读演示
### --- 脏读演示
——> 脏读: 一个事务读取到了另一个事务中尚未提交的数据
二、打开窗口登录 MySQL,设置全局的隔离级别为最低
### --- 登录是MySQL
——> 使用db2数据库
use db2;
——> 设置隔离级别为最低 读未提交
set global transaction isolation level read uncommitted;
### --- 关闭窗口,开一个新的窗口A ,再次查询隔离级别
——> 开启新的 窗口A
——> 查询隔离级别
查询隔离级别
### --- 再开启一个新的窗口B
~~~ # 查询数据,本次查询用户的账户余额都为1000
——> 登录数据库
——> 选择数据库
use db2;
——> 开启事务
start transaction;
——> 查询
select * from account;
### --- A窗口执行
——> 选择数据库
use db2;
——> 开启事务
start transaction;
——> 执行修改操作
-- tom账户 -500元
UPDATE account SET money = money - 500 WHERE NAME = 'tom';
-- jack账户 + 500元
UPDATE account SET money = money + 500 WHERE NAME = 'jack';
### --- B窗口查询操作
——> 查询账户信息
select * from account;

### --- A窗口转账异常,进行回滚
~~~ # A窗口的事务执行,出现异常进行回滚
rollback;
### --- B窗口再次进行查询账户
~~~ # 由于A窗口执行出现异常,对事务进行了回滚,B窗口再次进行查询时,发现前又不见了。
select * from account;
三、结局脏读问题
### --- 结局脏读问题
——> 脏读非常危险的,比如张三向李四购买商品,张三开启事务,向李四账号转入 500 块,
——> 然后打电话给李四说钱 已经转了。李四一查询钱到账了,发货给张三。
——> 张三收到货后回滚事务,李四的再查看钱没了。
——> 解决方案
——> 将全局的隔离级别进行提升为: read committed
### --- 在A窗口设置全局的隔离级别为read committed
set global transaction isolation level read committed;
### --- 重新开启A窗口,查看设置是否成功
select @@tx_isolation;
### --- 开启B窗口,A和B窗口选择数据库后,都开启事务

### --- A窗口只是更新两个账户,不提交事务
-- tom账户 -500元
UPDATE account SET money = money - 500 WHERE NAME = 'tom';
-- jack账户 + 500元
UPDATE account SET money = money + 500 WHERE NAME = 'jack';
### --- B窗口进行查询,没有查询到未提交的数据
mysqlselect * from account;

### --- A窗口commit提交数据
commit;
### --- B窗口查看数据
select * from account;

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
浙公网安备 33010602011771号