事务并发控制技术

简介: 事务并发控制技术

并发控制技术是实现事务隔离性以及不同隔离级别的 关键 , 实现方式有很多, 按照其对可能冲突的操作采取的不同策略可以分为 乐观并发控制悲观并发控制 两大类。

乐观并发控制 对于并发执行可能冲突的操作, 假定其不会真的冲突, 允许并发执行, 直到真正发生冲突时才去解决冲突, 比如让事务回滚
悲观并发控制 对于并发执行可能冲突的操作, 假定其必定发生冲突, 通过让事务等待(锁)或者中止(时间戳排序)的方式使并行的操作串行执行


基于封锁的并发控制

核心思想: 对于并发可能冲突的操作, 比如读-写, 写-读, 写-写, 通过锁使它们互斥执行。锁通常分为 共享锁排他锁 两种类型。

共享锁(S) 事务T对数据A加共享锁, 其他事务只能对A加共享锁但不能加排他锁
排他锁(X) 事务T对数据A加排他锁, 其他事务对A既不能加共享锁也不能加排他锁


基于锁的并发控制流程:

微信截图_20221208155501.png


锁管理器根据当前数据项是否已经有锁以及申请的和持有的锁是否冲突决定是否为该请求授予锁


可能出现的问题:

死锁 饥饿
多个事务持有锁并互相循环等待其他事务的锁导致所有事务都无法继续执行 数据项A一直被加共享锁, 导致事务一直无法获取A的排他锁

对于可能发生冲突的并发操作, 锁使它们由并行变为串行执行, 是一种 悲观的并发控制


基于时间戳的并发控制

核心思想: 对于并发可能冲突的操作, 基于时间戳排序规则选定某事务继续执行, 其他事务回滚。


系统会在每个事务开始时赋予其一个时间戳, 这个时间戳可以是系统时钟也可以是一个不断累加的计数器值, 当事务回滚时会为其赋予一个新的时间戳, 先开始的事务时间戳小于后开始事务的时间戳。


每一个数据项Q有两个时间戳相关的字段:

  • W-timestamp(Q): 成功执行write(Q)的所有事务的最大时间戳
  • R-timestamp(Q): 成功执行read(Q)的所有事务的最大时间戳


时间戳排序流程:

  • 读取资源

微信截图_20221208155521.png


  • 写入资源

微信截图_20221208155549.png


基于时间戳排序和基于锁实现的本质一样: 对于可能冲突的并发操作, 以串行的方式取代并发执行, 因而它也是一种 悲观并发控制 。它们的区别主要有两点:

  1. 基于锁是让冲突的事务进行 等待 , 而基于时间戳排序是让冲突的事务 回滚
  2. 基于锁冲突事务的执行次序是根据它们申请锁的顺序, 先申请的先执行 ; 而基于时间戳排序是根据 特定的时间戳排序规则


基于有效性检查的并发控制

核心思想: 事务对数据的更新首先在自己的工作空间进行, 等到要写回数据库时才进行有效性检查, 对不符合要求的事务进行回滚。


基于有效性检查的事务执行过程会被分为三个阶段:

  1. 读阶段: 数据项被读入并保存在事务的局部变量中。所有write操作都是对局部变量进行, 并不对数据库进行真正的更新。
  2. 有效性检查阶段: 对事务进行有效性检查, 判断是否可以执行write操作而不违反可串行性。如果失败, 则回滚该事务。
  3. 写阶段: 事务已通过有效性检查, 则将临时变量中的结果更新到数据库中。


有效性检查通常也是通过对事务的时间戳进行比较完成的, 不过和基于时间戳排序的规则不一样。该方法允许可能冲突的操作并发执行, 因为每个事务操作的都是自己工作空间的局部变量, 直到有效性检查阶段发现了冲突才回滚。因而这是一种 乐观的并发策略


基于快照隔离的并发控制

快照隔离是 多版本并发控制(mvcc) 的一种实现方式。


核心思想是: 数据库为每个数据项维护多个版本(快照), 每个事务只对属于自己的私有快照进行更新, 在事务真正提交前进行有效性检查, 使得事务正常提交更新或者失败回滚。


由于快照隔离导致事务看不到其他事务对数据项的更新, 为了避免出现丢失更新问题, 可以采用以下两种方案避免:

  1. 先提交者获胜: 对于执行该检查的事务T, 判断是否有其他事务已经将更新写入数据库, 是则T回滚否则T正常提交。
  2. 先更新者获胜: 通过锁机制保证第一个获得锁的事务提交其更新, 之后试图更新的事务中止。


事务间可能冲突的操作通过数据项的不同版本的快照相互隔离,到真正要写入数据库时才进行冲突检测。因而这也是一种乐观并发控制

目录
相关文章
|
11月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
471 1
Linux C/C++之IO多路复用(aio)
|
机器学习/深度学习 数据可视化 网络架构
增强深度学习模型的可解释性和泛化能力的方法研究
【8月更文第15天】在深度学习领域,模型的准确率和预测能力是衡量模型好坏的重要指标。然而,随着模型复杂度的增加,它们往往变得越来越难以理解,这限制了模型在某些关键领域的应用,例如医疗诊断、金融风险评估等。本文将探讨如何通过几种方法来增强深度学习模型的可解释性,同时保持或提高模型的泛化能力。
1234 2
|
10月前
|
Linux 数据库
linux 全局搜索文件
在 Linux 系统中,全局搜索文件常用 `find`、`locate` 和 `grep` 命令。`find` 根据文件名、类型、大小、时间戳等条件搜索;`locate` 通过预构建的数据库快速查找文件;`grep` 在文件中搜索特定文本,常与 `find` 结合使用。选择合适的命令取决于具体需求。
1247 2
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
24083 64
图解一致性哈希算法,看这一篇就够了!
|
11月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
278 2
|
存储
外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树
外部排序用于处理无法一次性加载到内存中的大规模数据排序问题。其基本原理是将外存数据划分为若干已内部排序的小块,利用内存中的缓冲区进行多路归并排序,并逐步合并以生成更大的有序块。通过增加缓冲区数量、优化关键字比较次数(如使用败者树)和调整归并段长度等方法可进一步提高排序效率。最佳归并树的应用则能有效减少磁盘I/O次数,从而优化整个排序过程。
455 8
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
609 2
|
消息中间件 存储 网络协议
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
Apache Kafka的单分区写入性能在某些严格保序场景中至关重要,但其现有线程模型限制了性能发挥。本文分析了Kafka的串行处理模型,包括SocketServer、KafkaChannel、RequestChannel等组件,指出其通过KafkaChannel状态机确保请求顺序处理,导致处理效率低下。AutoMQ提出流水线处理模型,简化KafkaChannel状态机,实现网络解析、校验定序和持久化的阶段间并行化,提高处理效率。测试结果显示,AutoMQ的极限吞吐是Kafka的2倍,P99延迟降低至11ms。
284 3
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
|
存储 缓存 固态存储
SPDK应用框架
SPDK应用框架
|
存储 API 开发者
学习spdk
学习spdk