一篇带你了解什么是事务及其原理
创始人
2024-04-21 14:40:06
0

一.什么是事务

事务: 指作为单个逻辑工作单元(Service方法)执行的一系列操作(数据库操作),要么全部执行,要么全部不执行。事务可以看做是一组任务,通常对应了一个业务方法,这些任务要么全部成功,要么全部失败。

本地事务有这么几个特征:

  • 一次事务只连接一个支持事务的数据库(一般来说都是关系型数据库)

  • 事务的执行结果保证[ACID]

  • 会用到数据库锁

事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID,缺一不可。

二.原子性 Atomicity

官方解释

Atomicity requires that each transaction be “all or nothing”: if one part of the transaction fails, then the entire transaction fails, and the database state is left unchanged. An atomic system must guarantee atomicity in each and every situation, including power failures, errors and crashes. To the outside world, a committed transaction appears (by its effects on the database) to be indivisible (“atomic”), and an aborted transaction does not happen.

关键词在于:

  • all or nothing,它的意思是数据库要么被修改了,要么保持原来的状态。所谓保持原来的状态不是我先insert再delete,而是压根就没有发生过任何操作。因为insert然后再delete实际上还是修改了数据库状态的,至少在数据库日志层面是这样。

  • indivisible,不可分割,一个事务就是一个最小的无法分割的独立单元,不允许部分成功部分失败。

利用Innodb的undo log,undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。 例如:

  • 当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据;

  • 当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作;

  • 当年insert一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行delete操作

undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

三.Consistency 一致性

官方解释

The consistency property ensures that any transaction will bring the database from one valid state to another. Any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof. This does not guarantee correctness of the transaction in all ways the application programmer might have wanted (that is the responsibility of application-level code), but merely that any programming errors cannot result in the violation of any defined rules.

一致性要求任何写到数据库的数据都必须满足于预先定义的规则(比如余额不能小于0、外键约束等),简单来说就是在任何时间点都不能出现违反一致性要求的状态。几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致,Mysql通过排他锁来保证一致性.

四.Durability 持久性

官方解释

The durability property ensures that once a transaction has been committed, it will remain so, even in the event of power loss, crashes, or errors. In a relational database, for instance, once a group of SQL statements execute, the results need to be stored permanently (even if the database crashes immediately thereafter). To defend against power loss, transactions (or their effects) must be recorded in a non-volatile memory.

持久性的关键在于一旦“完成提交”(committed),那么数据就不会丢失。undolog实现事务原子性,redolog实现事务的持久性,**Redo Log记录的是新数据的备份。**在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。

Undo + Redo事务的简化过程

1.A.事务开始. 
2.B.记录A=1到undo log. 
3.C.修改A=3. 
4.D.记录A=3到redo log. 
5.E.记录B=2到undo log. 
6.F.修改B=4. 
7.G.记录B=4到redo log. 
8.H.将redo log写入磁盘。 
I.事务提交

通过undolog(记录旧数据用来反悔)保证事务的原子性,redolog(记录新数据用来保存到磁盘)保证持久性。

采用redo log的好处

redo log进行刷盘比对数据页刷盘效率高,具体表现如下

  • redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。

  • redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

五.Isolation 隔离性

隔离性要求如果两个事务修改同一个数据,则必须按顺序执行,并且前一个事务如果未完成,那么未完成的中间状态对另一个事务不可见。

六.事务隔离级别

  1. 线程并发和事务隔离

    SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

    • 读未提交(READ UNCOMMITTED)

    • 读提交 (READ COMMITTED)

    • 可重复读 (REPEATABLE READ)

    • 串行化 (SERIALIZABLE)

      以上几个概念是事务隔离级别要实际解决的问题:脏读,不可重复读,幻读

  2. 脏读

    脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了不一定最终存在的数据,这就是脏读。读未提交会造成脏读;读提交可以解决脏读问题。

  3. 不可重复读

    可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的,那不可重复读就是一个事务多次读取到的数据是不一致的,通常针对数据更新(UPDATE)操作。即:同一个事务中多次使用相同条件读取到的数据是不一样的。

    set global transaction isolation level repeatable read;可重复读,这也是Mysql默认的事务隔离策略,但是该事务隔离级别没办法解决幻读问题。

  4. .幻读

    事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读 , 即:事物A两次读取相同条件的数据读到的条数不一样。

    MySQL 的可重复读隔离级别其实解决了幻读问题,它使用到了“间隙锁”。

  5. 串行化

    串行化是4种事务隔离级别中隔离效果最好的,解决了脏读、可重复读、幻读的问题,但是效果最差,它将事务的执行变为顺序执行,与其他三个隔离级别相比,它就相当于单线程,后一个事务的执行必须等待前一个事务结束。

    事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度

    隔离级别脏读不可重复读幻读
    读未提交(Read uncommitted)可能可能可能
    读提交(Read committed)不可能可能可能
    可重复读(Repeatable reads)不可能不可能可能
    串行化(Serializable)不可能不可能不可能

MySQL 事务隔离其实是依靠锁来实现的,加锁自然会带来性能的损失。而读未提交隔离级别是不加锁的,所以它的性能是最好的,没有加锁、解锁带来的性能开销。但有利就有弊,这基本上就相当于裸奔啊,所以它连脏读的问题都没办法解决。

七.事务隔离级别原理-MVCC

  1. 利用的是锁和MVCC机制

    MVCC的全称是**“多版本并发控制”(Multi Version Concurrency Control),。这项技术使得InnoDB的事务隔离级别下执行一致性读操作有了保证,换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,一个行记录数据有多个版本对快照数据,这些快照数据在undo log中**。 如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本

    这是一个可以用来增强并发性的强大的技术,因为这样的一来的话查询就不用等待另一个事务释放锁。这项技术在数据库领域并不是普遍使用的。一些其它的数据库产品,以及mysql其它的存储引擎并不支持它。

    可重复读是在事务开始的时候生成一个当前事务全局性的快照,而读提交则是每次执行语句的时候都重新生成一次快照。

八.丢失更新问题

脏读,幻读,不可重复读,都是发生在一个事务在写,一个事务在读的时候出现的问题,而丢失更新发生在两个事务都在做写操作的时候出现的,丢失更新分为:回滚丢失更新(一类)和覆盖丢失更新(二类)

  • 第一类丢失更新(回滚丢失,Lost update) (通过设置隔离级别可以防止 Repeatable Read)
  • 第二类丢失更新(覆盖丢失/两次更新问题,Second lost update) A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...