专栏首页后端事务解释
原创

事务解释

前言

事务是我们保证数据正确性的重要手段,只要和数据库打交道,就得理解它的 ACID 特性,这也是一个专业程序员应该掌握的基本技能。

事务是什么?

在数据库的世界里,我们最常打交道的是 SQL 操作语句。然而,SQL 语句并不是数据库的最小处理单位,事务才是。

事务包含了一条或多条 SQL 语句。这些 SQL 语句会被视为一个任务集合,而事务就保证了这个任务集合里的 SQL 要么全部执行完,要么都不执行,不会让数据处于一个中间操作状态。

在这里插入图片描述

数据库是面向多线程多用户设计的,同一时刻会被多个程序读取或修改。在并发操作时,需要考虑对同一资源的访问控制。而事务在这方面有完善的处理机制,后面将会提及到事务的隔离性。

另外,事务能保证数据的完整性,这包括逻辑上的完整以及物理上的完整性。

逻辑上的完整性是指不会存在中间状态的数据;只会成功或失败回滚。

物理上的完整性是指事务只要执行成功,那么即使重启也不会丢失执行结果。(当然,前提是数据文件没有损坏......)

事务的使用

事务的整体流程主要涉及到几个状态点:

(1)开始事务:BEGIN TRANSACTION;

(2)提交事务:COMMIT;

(3)回滚事务:ROLLBACK;

一般的,当我们在执行一条 SQL 语句时就已经默认帮我们开启了事务。若执行成功,则会提交事务。若执行失败,则会回滚事务。

其中,提交事务后,相对应的数据也会被持久化到硬盘上,即时重启也不会丢失。

事务的 ACID

前面提到过,事务能保证数据的完整性,它主要是通过 ACID 特性来保证的:

1、原子性(Atomicity)

事务是一个不可分割的单位,因此在一个事务里的所有操作要么全部生效,要么全部不生效。

2、一致性(Consistency)

也可以理解为是预期状态的正确性,即从一个正确的状态到另一个正确的状态,这里的状态往往是由业务来定义的。

比如转账中的一个扣钱一个加钱,是我们规定的一个数据流转,那么执行前的账户余额和转账后的账户余额就得满足加减特性,这就是所谓的业务正确。

3、隔离性(Isolation)

数据库是允许多个事务并发执行的,每个事务在执行时理想状态是互不影响。然而要达到这个效果就得串行执行事务,这样并发能力也会大大降低。

因此,为了兼顾执行效率,将互相影响的程度分为了 4 个隔离级别:

1)未提交读:

举个例子,当事务 A 对表 1 进行更新操作后,有事务 B 读取了更新后的数据,后面又由于某种原因,事务 A 进行了回滚。

这样对于事务 B 来讲就依赖了一个无效的回滚数据,从而后面所做出的决策,也不一定正确了,这就是所谓的脏读,也就是未提交读隔离级别,此级别数据一致性最差,但并发性最好。

2)已提交读:

如果想防止脏读,就需要等待其他事务提交后再进行读取操作。防止了无效的回滚情况,这就是已提交读隔离级别。

3)可重复读:

已提交读的隔离级别考虑到了数据回滚的无效性,却无法阻止事务的多次提交。

比如事务 A 不断的对表进行修改提交,那么事务 B 就会在不同的时间点读取到不同的数据。

为了让事务 B 在执行期间读取的数据都是一致的,就有了可重复读的隔离级别,即事务 B 在执行期间,其他事务不得进行修改操作。

4)可串行化:

上面的可重复读隔离级别保证了事务执行期间读取的一致性。然而这里并不包括插入、删除操作。

即会出现读多读少数据的情况,这种现象叫做幻读。

为了解决幻读,只得进行串行化执行事务,才能互不影响。而此时的事务并发性是最低的。

4、持久化(Durability)

最后一个事务特性就是持久化性。通过日志等手段,只要我们的事务提交成功了,那么就意味着这次的数据操作是成功的。即使下次重启了程序,也不会丢失此处的操作结果!

总结

事务的 ACID 特性保证了数据的完整性。其中,事务的隔离级别越高,数据一致性越好,但并发能力就越差。这是需要我们在实际开发中取舍的。像日志记录的读取,使用脏读就对总体影响不大。


感兴趣的朋友可以搜一搜公众号「 阅新技术 」,关注更多的推送文章。

可以的话,就顺便点个赞、留个言、分享下,感谢各位支持!

阅新技术,阅读更多的新知识。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试:mysql 事务和锁的解释

    对于mysql中注重事务优化的就是innodb引擎,我们学习一下innodb事务;

    黑白格
  • 可解释机器学习中无基本事实的解释评价

    原文题目:Evaluating Explanation Without Ground Truth in Interpretable Machine Learni...

    Jarvis Cocker
  • spring注解事务

     spring注解事务 <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.sprin...

    yawn
  • Spring事务详解

    最近在项目组的业务技术分析会上,有同事遇到事务的失效的场景导致线上业务不可用。如果对Spring事务的@Transactional理解有限的话,确实很容易在开发...

    麋鹿大哥
  • 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病!

    还记得刚入行开始写Java时,接触的第一个项目是国家电网的一个业务系统,这个系统据说投资了5亿人民币进行研发,鼎盛时期研发人员一度达到过500人。项目采用当时最...

    程序员内点事
  • 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病!

    前两天有个学弟公众号留言,说让讲讲分布式事务,面试就挂在这个问题上。时下随着微服务架构体系的流行,面试的题目也都慢慢开始升级,不再是早些年单纯的问点SSH框架知...

    程序员内点事
  • JDBC事务与事务隔离级别详解

        事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

    DencyCheng
  • 事件监听机制的通俗解释

    黑泽君
  • 我该如何选择解释器? 事后解释的基于应用的评估

    已有数项研究工作提出了新的可解释AI(XAI)方法,这些方法旨在生成具有特定属性或要求的模型解释,例如保真度,健壮性或人类可解释性。但是,很少根据解释对决策任务...

    YH
  • MySQL 中事务详解

    http://blog.csdn.net/qh_java/article/details/14045765

    bear_fish
  • spring @Transactional 事务注解

    value这里主要用来指定不同的事务管理器;主要用来满足在同一个系统中,存在不同的事务管理器。比如在Spring中,声明了两种事务管理器txManage...

    庞小明
  • 【事务】<查询不到同一调用方法其它事务提交的更新>解决方案

    先来看看Propagation属性的值含义,@Transactional中Propagation属性有7个选项可供选择:

    全栈程序员站长
  • 解读事务的ACID!

    事务的ACID特性大学数据库课程基本都学过,但是学完也就大概知道是干嘛的,后来也没仔细想这个东西了,后来接触了NoSQL系统的一致性,于是重新学习 ACID,发...

    Apache IoTDB
  • MySQL-长事务详解

    『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是...

    MySQL技术
  • 谈谈分布式事务之三: System.Transactions事务详解[上篇]

    在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务。.NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在Sy...

    蒋金楠
  • 谈谈分布式事务之三: System.Transactions事务详解[下篇]

    在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法。该方法对用于创建基于现有Transaction对象...

    蒋金楠
  • 分布式柔性事务之事务消息详解

    在 《柔性事务之TCC详解》 和《柔性事务之Saga详解》两文中我们详细剖析了柔性事务的第一个分支补偿型事务。在《刚性事务总结和柔性事务概述》中我们介绍过的柔性...

    江帅帅
  • 分布式柔性事务之事务消息详解

    在 《柔性事务之TCC详解》 和《柔性事务之Saga详解》两文中我们详细剖析了柔性事务的第一个分支补偿型事务。在《刚性事务总结和柔性事务概述》中我们介绍过的柔性...

    孙玄@奈学教育
  • MyBatis 事务管理解析:颠覆你心中对事务的理解!

    1.说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。

    Bug开发工程师

扫码关注云+社区

领取腾讯云代金券