ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

数据库学习(四)——事务处理(脏读、不可重复读、幻读全在这篇了)

2019-11-04 13:57:21  阅读:296  来源: 互联网

标签:transaction psn 幻读 事务处理 全在 set 脏读 select


目录

数据库学习(四)——事务处理

@

一、事务简介

1.正常的commit,自动提交
commit;
2.rollback
delete from xxx where xx;
delete from xxx where xx;
savepoint sp1;
delete from xxx where xx;
rollback to sp1;
3.事务的ACID特性
A:原子性,操作集合不可分割
C:一致性,经过N个操作,数据状态不会改变
I:隔离性,隔离性会导致效率降低,为了提高程序效率,可以设置隔离级别
隔离级别:读未提交,读已提交,可重复度,序列化
数据不一致问题:脏读、不可重复读、幻读
D:持久性,所有数据修改持久化到介质中,不会因为程序关闭,导致丢失
4.事务的特性中,哪个是最关键的?

所有特性,都是为了保证一致性,一致性是最终的追求。

一致性是通过原子性,隔离性,持久性保证的。

5.锁的机制:

为了解决并发访问,数据不一致,加锁得考虑粒度,

锁的粒度越小,效率越高,粒度越大,效率越低,大部分都是行级锁

二、脏读、幻读、不可重复读测试

1.打开命令行
select @@autocommit
set autocommit=0
2.数据准备
create database tran;
use tran;
create table psn(id int primary key,name varchar(10)) engine=innodb;
insert into psn values(1,"zhangsan");
insert into psn values(2,"lisi");
insert into psn values(3,"wangwu");
commit;
3.测试事务
--事务包含四个隔离级别:(从上往下隔离级别越来越高
read uncommitted; --读未提交
read commited; --读已提交
repeatable read; --可重复读
(seriable) --序列化执行,串行
4.测试1:模拟读未提交产生脏读
set session transaction isolation level read uncommitted;
A:start transaction;
B:start transaction;
A:select * from psn;
B:select * from psn;
A:update psn set name='msb'
--读取结果为msb,产生脏读,因为A事务没有commit

A:commit
B:select * from psn;
--此时读取的数据是msb,正常读取

这时候,我们两个表进行比较,发现,数据不一致了,产生脏读现象

5.测试2:模拟不可重复读
set session transaction isolation level read committed;
A:start transaction;
B:start transaction;
A:update psn set name='ppp'
B:select * from psn;
A:commit;
B:select * from psn;

这时候用AB进行查询,发现脏读没有了,但是出现不可重复读,因为在一次事务中,B读出了2个不一样的数据

6.测试3:模拟幻读
set session transaction isolation level repeatable read;
A:start transaction;
B:start transaction;
A:update psn set name='lisi'
B:select * from psn;
A:commit;
B:select * from psn;

这是候已经提交,但是B产生幻觉,还是之前数据,所以称为幻读。

7.总结表
隔离级别 异常情况
读未提交 脏读,重复读,幻读
读已提交 重复读,幻读
不可重复读 幻读
序列化

标签:transaction,psn,幻读,事务处理,全在,set,脏读,select
来源: https://www.cnblogs.com/littlepage/p/11791644.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有