查看原文
其他

MySQL 事务图解

关注Java就该这么学带你全面认识Java
Java就该这么学后台回复 1024 有特别礼包

责编:Java就该这么学 | 来源:熊本极客

链接:jianshu.com/p/963b8d293937

上一篇精彩:SpringBoot 三大开发工具,你都用过么?
大家好,我是Java就该这么学。


1.事务是什么?

事务是逻辑上的一组操作,要么都执行,要么都不执行

例子:假如张三要给李四转账200元,这个转账会涉及到两个关键操作就是:将张三的余额减少200元,将李四的余额增加200元。如果两个操作之间突然出现错误,例如银行系统崩溃导致张三余额减少,而李四的余额没有增加,这样的系统是有问题的。事务就是保证这两个关键操作要么都成功,要么都要失败。

事务的特性

 原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
 一致性:执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
 持久性:一个事务被提交之后,对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

2.事务隔离级别及实践

并发事务带来的问题
 脏读:当事务 T1 正在访问字段 A 并且对进行了修改,而这种修改还没有提交到数据库中。这时另外一个事务 T2 也访问和使用字段 A,但由于事务 T1 修改字段 A 后还没有提交 COMMIT,而那么事务 T2 读到的字段 A 是“脏数据”
 丢失修改:事务 T1 读取 A=20,事务 T2 也读取 A=20,事务 T1 修改 A=A-1,事务 T2 也修改 A=A-1,最终结果 A=19,事务 T1 的修改被丢失。
 不可重复读:一个事务内多次读同一数据且不一致。例如,事务 T1 在读取两次数据之间,事务 T2 修改了数据,导致事务 T1 两次读取的数据可能不太一样。
 幻读:幻读与不可重复读类似。事务 T1 读取了几行数据,接着另一个并发事务 T2 插入了一些数据时。接着事务 T1 就会发现多了一些原本不存在的记录,就好像发生了幻觉一样。

事务隔离级别与并发问题的关系

隔离级别脏读不可重复读幻影读
READ-UNCOMMITTED
READ-COMMITTED×
REPEATABLE-READ××
SERIALIZABLE×××

如何设置和使用事务
① 设置方式:

SET [SESSION|GLOBALTRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

② 使用方式

START TARNSACTION |BEGIN:显式地开启一个事务。
COMMIT:提交事务,使得对数据库做的所有修改成为永久性。
ROLLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

2.1 读取未提交 READ-UNCOMMITTED

允许读取尚未提交的数据变更,最低的隔离级别,可能导致脏读幻读不可重复读。另外,搜索公众号Linux就该这样学后台回复“git书籍”,获取一份惊喜礼包。

场景:设置事务隔离级别为读未提交,导致脏读。

2.2 读取已提交 READ-COMMITTED

允许读取并发事务已经提交的数据,可以避免脏读,可能导致幻读不可重复读

场景:设置事务隔离级别为读已提交,避免脏读。

场景:设置事务隔离级别为读已提交,导致不可重复读。

2.3 可重复读 REPEATABLE-READ

同一个事务下多次读取结果都是一致的,除非数据是被自己的事务所修改,可以避免脏读不可重复读,但可能导致幻读

场景:设置事务隔离级别为可重复读,避免不可重复读。





公众号后台回复 Java 或者 面试 有惊喜礼包!Java就该这么学交流群

 「Java就该这么学」建立了读者Java交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。

扫描添加好友邀你进Java群,加我时注明姓名+公司+职位】


版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

往日文章:

想了解Java后端学习路线?看完这篇就够了!
Java这个高级特性,很多人还没用过!
Maven 最全教程,看了必懂,99% 的人都收藏了!
Intellij IDEA 神级插件!效率提升 10 倍!
牛逼啊!接私活必备的 10 个开源项目!赶快收藏吧!
接口性能优化技巧,有点硬!
字节跳动28岁员工猝死
我已经不用 try catch 处理异常了!太辣鸡了!
8年开发,连登陆接口都写这么烂...
你应该掌握的10个 Git 命令

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存