数据库系统概念第十二章 事务

2024-08-24 11:18

本文主要是介绍数据库系统概念第十二章 事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务(Transaction)

事务是作为单个逻辑工作单元执行的一系列数据库操作,这些操作可能会修改多个表中的多个元组

事务正常执行的结构是:

begin;
SQL execution 1
SQL execution 2
...
SQL execution N
commit;

begin标志开始一个事务,多个SQL语句就是事务逻辑工作单元,commit(提交)是结束当前事务并提交事务内数据变更,让其生效

数据库一致性在事务上表现的比较特殊,具体来说:事务执行的过程中可以让数据库处于不一致状态,但一旦提交(commit)数据库必须回到一致的状态(一致性是指广义上的一致性,即真实世界的数据一致性,如A和B转帐他们的总账户余额不变等)。

ACID性质

  • Atomicity:原子性,一个事务要么所有操作被执行,要么全部都不被执行
  • Consistency:一致性,独立地看待一个事务,它必须保证数据库一致性
  • Isolation:独立性,多个事务允许并发的执行,但是必须保证事务之间不会互相干扰,并且一个事务执行过程对其他事务应该是透明的
  • Durability:持久性,当事务成功完成时,它对数据库的更改必须持久化

银行转账是介绍事务时最喜欢用的例子,账户A向账户B转账M元,表达成事务(抽象,非SQL,把update分成多步)就是:

read(A)
A = A - M
write(A)
read(B)
B = B + M
write(B)

这个转账过程是银行数据库经常需要完成的业务逻辑,我们可以把这样经常调用的事务封装成存储过程以供频繁调用(见存储过程一章)

ACID性质具体体现在这个存储过程上就是:

  1. A:要么转账过程的6个步骤全被完成要么全部不被完成,若A的账户不足M元,第三步write写失败(完整性约束),必须保证之前的操作对数据库均不产生影响
  2. C:A和B之和必须保证不变
  3. I:其他和A、B相关的并发转账事务或其他事务对当前转账不产生影响
  4. D:一旦A和B这两个账户持有者收到了转账成功的信息,那么该事务必须永久性生效,即使系统故障(权责划分明确,转账无误,即使故障不可恢复也应该由银行系统负责)

事务管理

了解事务管理之前必须了解一个事务在执行过程中可能处于状态:

  • Active:事务初始状态,执行时保持该状态
  • Partially committed:最后一个操作被执行后的状态(还未commit)
  • Failed:发现错误,停止执行
  • Aborted:事务被回滚(rollback)数据库恢复到事务执行前的状态, - Aborted后有两个选择:重新执行(如果事务内部没有逻辑错误)、kill该事务
  • Committed:事务成功执行完成后的状态

事务状态转换关系如下图:

这里写图片描述

从ACID性质以及上面的事务状态关系可以看出,数据库事务管理主要处理两件事情:

  • 错误/失败:事务执行失败(逻辑错误、系统崩溃、断电等等异常)时恢复处理
  • 并发执行:多个事务能够并发执行(并发的意义在于提高CPU和磁盘利用率,提高吞吐率,以及降低平均响应时间),并且防止并发事务间互相影响对数据库一致性的破坏

并发调度

这里写图片描述

冲突可串行化(Conflict Serialisability)

调度不同,事务执行结果也不同。我们必须有一个标准来判断某种调度是否正确。这个标准就是事务串行——先执行事务1的所有指令,再执行事务2的所有指令——后的结果。如果调度结果与串行结果相同,则调度正确;反之则错误。此概念与操作系统中多线程的执行类似。

这里写图片描述

优先图判断是否是冲突可串行化:

  1. 先画出每个 transaction(T1 T2 T3…)
  2. 找到所有的 读写操作,按照先后顺序,将 read—>write, write—>read, write—>write 连起来,都是前指向后,这些读写都是不同 transaction之间,相同的 transaction 内部不管,如果是相同路径的线段重复多条,只画一条。
  3. 如果画完了有环,则是非冲突可串行化,就是有冲突,但是不能串行化的。

这里写图片描述

画完图,拓扑排序后得到
这里写图片描述

这篇关于数据库系统概念第十二章 事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102324

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

MYSQL事务死锁问题排查及解决方案

《MYSQL事务死锁问题排查及解决方案》:本文主要介绍Java服务报错日志的情况,并通过一系列排查和优化措施,最终发现并解决了服务假死的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录问题现象推测 1 - 客户端无错误重试配置推测 2 - 客户端超时时间过短推测 3 - mysql 版本问

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因