MySQL 事务图解

肉眼品世界

共 1791字,需浏览 4分钟

 · 2022-03-06

作者:熊本极客
链接:https://www.jianshu.com/p/963b8d293937

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

允许读取尚未提交的数据变更,最低的隔离级别,可能导致脏读幻读不可重复读

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

2.2 读取已提交 READ-COMMITTED

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

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

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

2.3 可重复读 REPEATABLE-READ

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

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

推荐阅读:

世界的真实格局分析,地球人类社会底层运行原理

不是你需要中台,而是一名合格的架构师(附各大厂中台建设PPT)

企业IT技术架构规划方案

论数字化转型——转什么,如何转?

华为干部与人才发展手册(附PPT)

企业10大管理流程图,数字化转型从业者必备!

【中台实践】华为大数据中台架构分享.pdf

华为的数字化转型方法论

华为如何实施数字化转型(附PPT)

超详细280页Docker实战文档!开放下载

华为大数据解决方案(PPT)


浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报