MySQL事务、隔离级别
1|0一、事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
2|0二、有关事务操作
MySQL中的事务是默认的自动提交的,我们可以手动的去关闭 或者开启事务
3|0三、事务的四大特性(ACID)
原子性(Atomicity) : 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性 (Consistency) : 事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation) : 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability) : 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
4|0四、并发事务问题
4|1 1、脏读
一个事务读到另一个事务还没有提交的事务。
4|2 2、不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同。
4|3 3、幻读
一个事务在按照条件查询数据时,没有这条数据,但是在插入数据时却又发现有这条数据已经存在,好像出现了“幻觉”。
5|0五、事务的隔离级别
5|1 1、读未提交(Read uncommitted)
可能出现:脏读、不可重复读、幻读;隔离级别最差,性能最高。
5|2 2、读已提交(Read committed)
可能出现:不可重复读、幻读。
5|3 3、可重复读(Repeatable Read(mysql的默认隔离级别))
可能出现:幻读。
5|4 4、串行化(Serializable)
上述并发问题都可解决,隔离级别最高,但是性能最差。
5|5 场景一
在idea中开启两个控制台,设置事务级别为 读未提交隔离级别 并开启事务
控制台1 第一次查询
控制台2 执行如下语句 未提交
控制台1 再次查询
可见在控制台2执行更新操作后,还没提交,控制台1再次执行查询操作时,查询到的数据已经改变了,证实了读未提交发生脏读现象。
5|6 场景二
在idea中开启两个控制台,设置事务级别为 读已提交隔离级别 并开启事务
控制台1 第一次查询
控制台2 执行如下语句 未提交
控制台1 再次查询
证实了事务的隔离级别设置为读已提交解决了脏读问题
5|7 场景三
在idea中开启两个控制台,设置事务级别为 读已提交 并开启事务
控制台2 执行如下语句 未提交
控制台1 第一次查询
控制台2 执行commit提交后 控制台1 再次查询结果不同
可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了读已提交发生了不可重复读问题
5|8 场景四
在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务
控制台2 执行如下语句 未提交
控制台1 第一次查询
控制台2 执行commit提交后 控制台1 再次查询结果相同
可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了可重复读隔离级别解决了不可重复读问题
5|9 场景五
在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务
控制台1 第一次查询 为空
控制台2 执行插入 并提交
控制台1 执行相同的插入sql 发现已经存在 于是就查询,但是又查不到数据
对于控制台1来说就像是“幻觉”一样,证实了可重复读隔离级别发生了幻读问题
5|10 场景六
在idea中开启两个控制台,设置事务级别为 串行化隔离级别 并开启事务
控制台1 执行查询 为空
控制台2 执行插入 可见操作阻塞
控制台1提交事务后,控制台2才能够完成插入操作
这种阻塞的效果有效的避免了幻读问题,证实了串行化隔离级别解决了幻读问题
总结:实际使用还得根据业务本身去设置隔离级别,隔离级别越高、数据越安全高但性能也越差,隔离级别越低、数据越不安全但性能越好,在设置事务隔离级别时要权衡数据安全和性能。一般情况我们都会采用数据库的默认隔离级别(Repeatable Read)
__EOF__

本文链接:https://www.cnblogs.com/yclblogs/p/15978787.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示