专栏首页在码圈MySQl 事务测试

MySQl 事务测试

1、打开mysql的命令行,将自动提交事务给关闭

--查看是否是自动提交 1表示开启,0表示关闭
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;	--可重复读
(seariable)			--序列化执行,串行执行
--产生数据不一致的情况:
脏读
不可重复读
幻读

隔离级别

异常情况

异常情况

读未提交

脏读

不可重复读

幻读

读已提交

不可重复读

幻读

可重复读

幻读

序列化

4、测试1:脏读 read uncommitted

set session transaction isolation level read uncommitted;
A:start transaction;
A:select * from psn;
B:start transaction;
B:select * from psn;
A:update psn set name='msb';
A:selecet * from psn
B:select * from psn;  --读取的结果msb。产生脏读,因为A事务并没有commit,读取到了不存在的数据
A:commit;
B:select * from psn; --读取的数据是msb,因为A事务已经commit,数据永久的被修改

5、测试2:当使用read committed的时候,就不会出现脏读的情况了,当时会出现不可重复读的问题

set session transaction isolation level read committed;
A:start transaction;
A:select * from psn;
B:start transaction;
B:select * from psn;
--执行到此处的时候发现,两个窗口读取的数据是一致的
A:update psn set name ='zhangsan' where id = 1;
A:select * from psn;
B:select * from psn;
--执行到此处发现两个窗口读取的数据不一致,B窗口中读取不到更新的数据
A:commit;
A:select * from psn;--读取到更新的数据
B:select * from psn;--也读取到更新的数据
--发现同一个事务中多次读取数据出现不一致的情况

6、测试3:当使用repeatable read的时候(按照上面的步骤操作),就不会出现不可重复读的问题,但是会出现幻读的问题

set session transaction isolation level repeatable read;
A:start transaction;
A:select * from psn;
B:start transaction;
B:select * from psn;
--此时两个窗口读取的数据是一致的
A:insert into psn values(4,'sisi');
A:commit;
A:select * from psn;--读取到添加的数据
B:select * from psn;--读取不到添加的数据
B:insert into psn values(4,'sisi');--报错,无法插入数据
--此时发现读取不到数据,但是在插入的时候不允许插入,出现了幻读,设置更高级别的隔离级别即可解决

总结:

​ 现在学习的是数据库级别的事务,需要掌握的就是事务的隔离级别和产生的数据不一致的情况

后续会学习声明式事务及事务的传播特性以及分布式事务

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis 架构

    Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写...

    Parker
  • 总结Js方法工具类库,总有你需要的方法

    实际开发工程中,会遇到一些重复的逻辑功能处理或者说是比较繁琐的前端函数。粗略整理了一下,希望对正在浏览的你有所帮助,也希望帮助新入行的小白们解决一下工作中的负担...

    Parker
  • Java API设计 - RESTful之统一返回格式

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。它的大原则容易把握,但是细节不容易做对。本文总结 RESTful 的设计细节,介...

    Parker
  • PL/SQL 集合的初始化与赋值

        对于集合类型,与单一的数据类型相比较而言,应该以一个整体的观念来考虑集合,即是一批类型相同的数据组合而非单一的数据。因此集 合类型集合的声明、赋值、初...

    Leshami
  • mysql查找出现出现两次的项半路遇到迪威贵宾会I8Io883oo

    mysql> select a, count(*) from x group by a;

    用户5782834
  • 达梦数据库适配问题

    达梦数据库和Oracle同样,对字段的长度有严格的规范,当然Mysql也是有的,但是默认是不启用的,哪怕超出了,也会自动扩容,但是Oracle和达梦是不会的;

    彼岸舞
  • PTC(pay to click)—— 躺着赚钱(比特币)?

    城市中的游牧民族
  • SNMP(简单网络管理协议)

    在网络规模日趋扩大,设备越来越多、功能越来越强的同时,网络的管理也面临着新的挑战,这将导致网络管理困难加剧。传统的网络管理,在特定的环境下或者小型网络中也许可以...

    小手冰凉
  • (NXP)LS1012 LS1043 LS1046 LS1028 性能PK对比-飞凌嵌入式

    在5G和工业互联网的大背景推动下,恩智浦的合作伙伴也推出了不少基于Layerscape通信处理器核心板,比如飞凌嵌入式就先后推出的FET1012A-C、FET1...

    嵌入式小白
  • 薪太软亮相第八届中国公益慈善项目交流展示会,支持脱贫攻坚|腾讯SaaS加速器·学员动态

    ? 来源 |  腾讯SaaS加速器首期项目-薪太软 ---- 9月18至20日,第八届中国公益慈善项目交流展示会(以下简称“慈展会”)在深圳会展中心隆重举行,...

    腾讯SaaS加速器

扫码关注云+社区

领取腾讯云代金券