前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ddia-事务

ddia-事务

作者头像
changan
发布于 2021-03-23 03:34:27
发布于 2021-03-23 03:34:27
6660
举报

transaction

事务是一个抽象层,允许应用程序假装某些并发问题和某些类型的硬件和软件故障不存在。各式各样的错误被简化为一种简单情况:事务中止(transaction abort),而应用需要的仅仅是重试。

如果没有事务处理,各种错误情况(进程崩溃,网络中断,停电,磁盘已满,意外并发等)意味着数据可能以各种方式变得不一致。例如,非规范化的数据可能很容易与源数据不同步。如果没有事务处理,就很难推断复杂的交互访问可能对数据库造成的影响。

本章深入讨论了并发控制的话题。我们讨论了几个广泛使用的隔离级别,特别是:

  • 读已提交,
  • 快照隔离(有时称为可重复读)
  • 可序列化

并通过研究竞争条件的各种例子,来描述这些隔离等级:

脏读

一个客户端读取到另一个客户端尚未提交的写入。读已提交或更强的隔离级别可以防止脏 读。

要求读锁的办法在实践中效果并不好。因为一个长时间运行的写入事务会迫使许多只读 事务等到这个慢写入事务完成。这会损失只读事务的响应时间,并且不利于可操作性.

大多数数据库使用如下方式防止脏读:对于写入的每个对象,数据库都 会记住旧的已提交值,和由当前持有写入锁的事务设置的新值。 当事务正在进行时,任何其 他读取对象的事务都会拿到旧值。 只有当新值提交后,事务才会切换到读取新值。

脏写

一个客户端覆盖写入了另一个客户端尚未提交的写入。几乎所有的事务实现都可以防止脏 写。

数据库通过使用行锁(row-level lock) 来防止脏写:当事务想要修改特定 对象(行或文档)时,它必须首先获得该对象的锁。然后必须持有该锁直到事务被提交或中 止。一次只有一个事务可持有任何给定对象的锁;如果另一个事务要写入同一个对象,则必 须等到第一个事务提交或中止后,才能获取该锁并继续。这种锁定是读已提交模式(或更强 的隔离级别)的数据库自动完成的。

读取偏差(不可重复读)

在同一个事务中,客户端在不同的时间点会看见数据库的不同状态。快照隔离经常用于解决 这个问题,它允许事务从一个特定时间点的一致性快照中读取数据。快照隔离通常使用多版 本并发控制(MVCC) 来实现。

更新丢失

两个客户端同时执行读取-修改-写入序列。其中一个写操作,在没有合并另一个写入变更情 况下,直接覆盖了另一个写操作的结果。所以导致数据丢失。快照隔离的一些实现可以自动 防止这种异常,而另一些实现则需要手动锁定( SELECT FOR UPDATE )。

使用提供的原子操作或显示锁定

写偏差

一个事务读取一些东西,根据它所看到的值作出决定,并将决定写入数据库。但是,写作的 时候,决定的前提不再是真实的。只有可序列化的隔离才能防止这种异常。

幻读

事务读取符合某些搜索条件的对象。另一个客户端进行写入,影响搜索结果。快照隔离可以 防止直接的幻像读取,但是写入歪斜环境中的幻影需要特殊处理,例如索引范围锁定。

弱隔离级别可以防止这些异常情况,但是让应用程序开发人员手动处理其他应用程序(例 如,使用显式锁定)。只有可序列化的隔离才能防范所有这些问题。

可序列化与两阶段锁

数十年来,两阶段锁定一直是实现可序列化的标准方式,但是许多应用出于性能问题的考虑避免使用它。

在2PL中,写入不仅会阻塞其他写入,也会阻塞读,反之亦然。快照隔离使得读不阻塞写,写 也不阻塞读(参阅“实现快照隔离”),这是2PL和快照隔离之间的关键区别。另一方面,因为 2PL提供了可序列化的性质,它可以防止早先讨论的所有竞争条件,包括丢失更新和写入偏 差。

实现两阶段锁

读与写的阻塞是通过为数据库中每个对象添加锁来实现的。锁可以处于共享模式(shared mode)或独占模式(exclusive mode)。

  • 若事务要读取对象,则须先以共享模式获取锁。允许多个事务同时持有共享锁。但如果另一个事务已经在对象上持有排它锁,则这些事务必须等待
  • 若事务要写入一个对象,它必须首先以独占模式获取该锁。没有其他事务可以同时持有锁(无论是共享模式还是独占模式),所以如果对象上存在任何锁,该事务必须等待。
  • 如果事务先读取再写入对象,则它可能会将其共享锁升级为独占锁。升级锁的工作与直接获得排他锁相同。
  • 事务获得锁之后,必须继续持有锁直到事务结束(提交或中止)。这就是“两阶段”这个名字的来源:第一阶段(当事务正在执行时)获取锁,第二阶段(在事务结束时)释放所有的锁。
例子

事务 B 的 update 语句会被阻塞,直到事务 A 执行 commit 之后,事务 B 才能继续执行。

也就是说,在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10
1983年,Andreas Reuter and Theo Härder 提出了事务之中重要的四个特性:
HappenLee
2018/09/05
5290
事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10
DDIA 笔记
本文为 design data-intensive applications 的读书笔记 第一部分:数据系统的基石 第一章:可靠性、可扩展性、可维护性 现今很多应用程序都是 数据密集型(data-intensive) 的,而非 计算密集型(compute- intensive)的。因此CPU很少成为这类应用的瓶颈,更大的问题通常来自数据量、数据复杂 性、以及数据的变更速度。 许多应 用程序都需要: 存储数据,以便自己或其他应用程序之后能再次找到 (数据库(database)) 记住开销昂贵操作的结果,加
王磊-字节跳动
2020/08/08
3K0
弱隔离级别 & 事务并发问题
如果两个事务操作的是不同的数据, 即不存在数据依赖关系, 则它们可以安全地并行执行。但是当出现某个事务修改数据而另一个事务同时要读取该数据, 或者两个事务同时修改相同数据时, 就会出现并发问题。
真正的飞鱼
2022/09/11
6050
精通Java事务编程(7)-可串行化隔离级别之两阶段锁定(2PL,two-phase locking)
之前我们知道,加锁可防止脏写:即若两个事务同时尝试写入同一对象,则锁可确保第二个写必须等第一个写完成事务(中止或提交)才能继续。
JavaEdge
2022/07/25
8850
一文彻底读懂MySQL事务的四大隔离级别
今天在做固资系统时遇到一个问题,就是无论如何事务提交都不生效,于是决定实施实验,探究下背后的原理。本文主要分为三部分,第一部分讲解事务机制生效的原理。第二部分讲为了使事务生效,我都尝试了哪些方法,并解释每种尝试有效或无效的原因。第三部分讲解一下为什么我们需要事务机制。
用户1413827
2023/11/28
7880
一文彻底读懂MySQL事务的四大隔离级别
精通Java事务编程(8)-可串行化隔离级别之可串行化的快照隔离
串行化的隔离级别和高性能就是相互矛盾的吗?也许不是,一个称为可串行化快照隔离(SSI, serializable snapshot isolation)算法很有前途。提供完整的可串行化保证,而性能与快照隔离相比只有很小性能损失。 SSI在 2008 年首次被提出,如今既用于单节点DB(PostgreSQL9.1后的可串行化)和分布式DB(FoundationDB)。由于 SSI 与其他并发控制机制相比还很年轻,还在实践中证明自己。
JavaEdge
2022/07/25
9580
精通Java事务编程(8)-可串行化隔离级别之可串行化的快照隔离
步步为营,剖析事务中最难的——隔离性
数据库试图通过事务隔离(transaction isolation)来给用户提供一种隔离保证,从而降低应用侧的编程复杂度。最强的隔离性,可串行化(Serializability),可以对用户提供一种保证:任意时刻,可以认为只有一个事务在运行。
木鸟杂记
2022/12/07
3050
步步为营,剖析事务中最难的——隔离性
浅谈MySQL并发控制:隔离级别、锁与MVCC
如果数据库中的事务都是串行执行的,这种方式可以保障事务的执行不会出现异常和错误,但带来的问题是串行执行会带来性能瓶颈;而事务并发执行,如果不加以控制则会引发诸多问题,包括死锁、更新丢失等等。这就需要我们在性能和安全之间做出合理的权衡,使用适当的并发控制机制保障并发事务的执行。
程序员小高
2020/04/29
1.7K0
SQL Server 事务隔离级别
以上说明事务隔离级别主要针对读操作来说的。(DML语句我们可以不考虑事务隔离级别,因为任何事物隔离级别下DML的加锁都很严格,属于得不到就等待的类型)
yaphetsfang
2020/07/30
1.3K0
SQL Server 事务隔离级别
「数据库架构」三分钟搞懂事务隔离级别和脏读
最近,当开发人员David Glasser了解MongoDB默认执行脏读的糟糕方式时,MongoDB再次成为Reddit的佼佼者。在本文中,我们将解释什么是隔离级别和脏读以及如何在流行的数据库中实现它们。
架构师研究会
2020/07/20
1.5K0
「数据库架构」三分钟搞懂事务隔离级别和脏读
SQL事务隔离实用指南
您可能已经在数据库的文档中看到了隔离级别,感到有些手足无措。很少有日常使用事务的例子真正提到了隔离。大多数使用数据库的默认隔离级别,并希望获得最好的隔离级别。这是一个需要理解的基本话题,如果你花点时间来研究这个指南,你会对SQL事务隔离有深入的认识。 基本的定义 为了正确地理解SQL隔离级别,我们首先应该考虑事务本身。交易的概念来自合同法:法律交易必须是原子的(要么所有的条款都适用,要么没有),一致的(遵守法律协议),并且是持久的(在承诺之后,各方不能收回他们的承诺)。这些属性是数据库管理系统中流行的“AC
CSDN技术头条
2018/02/08
1.2K0
SQL事务隔离实用指南
当数据库遇到分布式两者会擦出怎样的火花!
数据库通常有着完善的事务支持,但是局限于单机的存储和性能,于是就出现了各种分布式解决方案。最近读了《Designing Data-Intensive Applications》这本书,所以做一个总结,供大家做个参考,有什么不对的请大家指正,一起讨论。
Java程序猿
2021/07/30
8300
Mysql锁机制分析【面试+工作】
数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则;对于任何一种数据库来说都需要有相应的锁定机制,Mysql也不例外。
Java帮帮
2018/11/22
8650
事务、锁、死锁
并发执行会打破事务的隔离性,根据破坏的程度分成可重复读、读已提交、读未提交等隔离级别,每种级别都决定了多线程并发时数据可见性不同,是并发和隔离性之间的权衡,也因此产生了幻读、不可重复读、脏读等问题。
冰寒火
2023/03/01
6570
[转] 事务并发的可能问题与其解决方案
写操作加了“持续-X锁”,读操作加了“临时-S锁”,没能阻止事务B写,发生了提交覆盖。
JMCui
2018/10/25
1K1
首次公开 | 一文了解京东分布式事务中间件 JDTX
在单一数据节点中,事务仅限于对单一数据库资源的访问控制,称之为本地事务。几乎所有的成熟的关系型数据库都提供了对本地事务的原生支持。但是在基于微服务的分布式应用环境下,越来越多的应用场景要求对多个服务的访问及其相对应的多个数据库资源能纳入到同一个事务当中,分布式事务应运而生。
kirito-moe
2019/10/30
1.1K0
首次公开 | 一文了解京东分布式事务中间件 JDTX
精通Java事务编程(2)-弱隔离级别之已提交读
并发 BUG 很难通过测试找到,因为这样的错误只有在特殊时序下才会触发。这样的时序问题可能非常少发生,通常很难重现 1。并发性也很难推理,特别是在大型应用中,你不一定知道哪些其他代码正在访问DB。只有一个用户访问数据时,应用开发就够麻烦了,多用户并发更困难,每个数据都可能被多个用户修改。
JavaEdge
2022/07/25
5960
精通Java事务编程(2)-弱隔离级别之已提交读
SQL Server 2008多版本并发控制
数据库的一致性,也是衡量DBMS性能的重要指标之一。目前大多数商业数据库(DB2, SQL Server)的并发控制采用的是两阶段锁(Two-Phase Locking,2PL)协议,2PL保证了并发事务执行的可串行化。但2PL在对任何数据进行读、写操作之前,需要对该数据加锁。在封锁相容矩阵中,S锁(Share Locks,共享锁)和X锁(Exclusive Locks,排它锁)是不相容的,因此当事务1正对数据A进行读操作(加S锁)时,事务2想要对数据进行写操作(加X锁),那么事务2必须等待事务1释放数据A
张善友
2018/01/30
1.3K0
精通Java事务编程(9)-总结
事务作为抽象层,允许应用忽略DB 内部一些复杂并发问题和某些硬件、软件故障,简化应用层的处理逻辑:事务中止(transaction abort),而应用仅需重试。对复杂访问模式,事务可大大减少需要考虑的潜在错误情景数量。
JavaEdge
2022/07/25
3580
SQL Server中锁与事务隔离级别
SQL Server中可以锁定的资源包括:RID或键(行)、页、对象(如表)、数据库等等。
雪飞鸿
2018/09/05
1.4K0
SQL Server中锁与事务隔离级别
推荐阅读
相关推荐
事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档