sql1复习笔记13

sql1复习笔记13

1.事务隔离性-脏读

事务的隔离性分为四种隔离性。

  1. read uncommitted 读未提交的
  2. read committed 读已经提交的
  3. repeatable read 可以重复读
  4. serializable 串行化

–read uncommitted
如果有事务a和事务b两个事务,a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b可以看见a操作的结果。

insert into user1 values(3,'小明',1000);
insert into user1 values(4,'淘宝店',1000);

小明去淘宝店买800鞋子,淘宝店会看800块钱有米有到手。
—如何查看数据库的隔离级别?

//mysql8.0
select @@global.transaction_isolation;
//mysql 5.x
select @@tx_isolation;

—如何修改数据库的隔离级别?

set global transaction isolation level read uncommitted;
/隔离性改变成了uncommitted

小明去淘宝店买800鞋子,淘宝店会看800块钱有米有到手。
小明-成都-ATM;淘宝店-广州-ATM

start transaction;
update user1 set money= money-800 where name= '小明';
update user1 set money= money+800 where name= '淘宝店';
//淘宝店查账成功,发货
//晚上请女朋友吃好吃的,花了1800
//结账发现钱不够,因为小明
rollback;
//淘宝店损失的原因是【没有提交的数据被脏读】
//如果两个不同的地方,都在进行操作,如果事务a开启之后,它的数据可以被其他事务读取到。
//会出现脏读的问题(一个事务读到了另一个事务没有提交的数据,就叫做脏读)
//实际开发中不允许脏读的出现。

2.事务隔离性-不可重复性

read committed 一个事务可以读到另一个事务已经提交的数据。

//修改隔离级别为read-committed
set global transaction isolation level read committed;
/隔离性改变成了committed
select @@global.transaction_isolation;

bank数据库的user1表,有
小张:会计,要做报表

start transaction;
select * from user1;
//小张上厕所去了,很长时间

小王:办理了一个开户并存款

start transaction;
insert into user1 values(5,'c',100);
commit;
select * from user1;

小张回来了,要算刚才查的平均数

select avg(money) from user1;
//发现平均值不对了
//因为我脑子看到是前面读的表,实际是数据是你提交的了。
//因为【存在不可重复读现象】 read committed

3.事务隔离性-幻读

repeatable read

//修改隔离级别为repeatable read
set global transaction isolation level repeatable read;
//隔离性改变成了repeatable 
select @@global.transaction_isolation;

又会出现什么问题?
张全蛋:在成都
开启事务-开户

start transaction;//同时开启事务

王尼玛:在北京

start transaction;

张全蛋:在成都
插入了一条数据

insert into user1 values(6,'d',1000);
commit;

即便张全蛋提交了,王尼玛也读不到,但无法新增张全蛋提交的数据。
事务a操作和b操作可以同时操作一张表,事务a提交的数据,也不能被事务b读到,就可能造成幻读。因为我虽然没读到,但已经添加进去的数据会影响我的操作。

4.隔离级别-串行化_SERIALIZABLE

修改隔离级别为串行化

//修改隔离级别为serializable
set global transaction isolation level serializable;
//隔离性改变成了serializable
select @@global.transaction_isolation;

张全蛋:在成都
开启事务-开户

start transaction;//同时开启事务

王尼玛:在北京

start transaction;

张全蛋:在成都
插入了一条数据

insert into user1 values(6,'d',1000);
commit;

王尼玛:insert

select * from user1;
//能读到张全蛋的操作了

张全蛋:插入王晓华

insert into user1 values(8,'e',1000);

发现语句被卡住了。

这个事务的意思就是,a事务没有commit的时候,其他事务的写操作是不可以进行的。进入排队状态,直到a事务commit。

有可能存在等待超时问题。

还有可能出现,王尼玛commit之后,张全蛋从卡的状态到马上就执行,性能特差!!!

总结:
性能最高:read-uncommitted(各种各样的问题)>read-committed(不可重复读)>repeatable-read(幻读)>serializable:隔离级别最高。
默认级别是repeatable-read。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值