mysql事务测试

mysql事务测试

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

--查看是否是自动提交 1表示开启,0表示关闭 select @@autocommit; --设置关闭 set autocommit = 0;

数据准备

--创建数据库 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;

测试事务

--事务包含四个隔离级别:从上往下,隔离级别越来越高,意味着数据越来越安全 read uncommitted; --读未提交 read commited; --读已提交 repeatable read; --可重复读 (seariable) --序列化执行,串行执行 --产生数据不一致的情况: 脏读 不可重复读 幻读
隔离级别 异常情况 异常情况
读未提交 脏读 不可重复读 幻读
读已提交 不可重复读 幻读
可重复读 幻读
序列化

测试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,数据永久的被修改

测试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;--也读取到更新的数据 --发现同一个事务中多次读取数据出现不一致的情况

测试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');--报错,无法插入数据 --此时发现读取不到数据,但是在插入的时候不允许插入,出现了幻读,设置更高级别的隔离级别即可解决

总结

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

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


__EOF__

本文作者等不到的口琴
本文链接https://www.cnblogs.com/Courage129/p/14059049.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   等不到的口琴  阅读(135)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示