sql1复习笔记13
1.事务隔离性-脏读
事务的隔离性分为四种隔离性。
- read uncommitted 读未提交的
- read committed 读已经提交的
- repeatable read 可以重复读
- 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。