反应型关系数据库事务

Spring Framework最近宣布将提供对反应式事务管理的支持 。
让我们深入研究它对R2DBC(SQL数据库访问的反应式规范)如何工作。

事务管理是一种模式,而不是特定于技术的。 从这个角度来看,它的属性和运行时行为是实现技术的功能。

TL; DR:从数据库的角度来看,命令式和响应式事务的工作原理相同。 从Java的角度来看,命令式事务和反应式事务之间存在一些差异。

让我们先来看命令式交易。

命令性交易

在命令性事务中,更具体地说,在具有例如拦截器的面向方面的事务管理中,事务状态通常对于代码是透明的。 根据底层API,我们可以从某处获取事务状态和事务绑定资源。 这个地方通常生活在一个ThreadLocal存储。 命令性事务假定代码的所有事务工作都在同一Thread

命令性事务的另一个方面是,在进行事务时,所有数据都保留在@Transactional方法内。 诸如JPA之类的工具允许通过Java 8 Stream.进行结果流传输Stream. 在任何情况下,流传输都需要使用@Transactional方法。 事务正在进行时,任何事务数据都不能离开方法–数据不会逃逸。

我指出这两个问题是因为它们在被动事务中的行为不同。

资源绑定

在继续进行被动交易之前,我们需要提高对交易状态的理解。 事务状态通常由事务状态(启动,提交,回滚)和绑定到事务的资源组成。

事务资源,例如数据库连接,通常将其事务进度绑定到基础传输连接。 在大多数情况下,这是TCP连接。 如果数据库连接使用多路复用,则状态将绑定到会话对象。 在极少数情况下,数据库操作会接受事务或会话标识符。 因此,我们假设将连接绑定到事务以包含能力最低的方法,因为事务状态通常无法跨连接移植。

反应性交易

使用反应式编程时,我们希望在使用事务时应用相同级别的便利性(阅读:使用相同的编程模型),而在使用基于注释的事务划分时,最好使用@Transactional方法。 回到交易管理只是一种模式的概念,我们唯一需要交换的就是技术。

反应性事务不再将其事务状态绑定到ThreadLocal而是绑定到订户上下文。 那是与特定执行路径关联的上下文。 或者换句话说:每个具体化的反应性序列都具有与其他执行隔离的订户上下文。 这已经是命令式交易的第一个区别。

第二个区别是@Transactional方法中的数据转义。
使用反应式流的反应式编程几乎全部涉及通过功能反应式运算符进行的数据流和数据流。 与异步API相比,这也是一个主要优点,即异步Publisher者在数据库驱动程序解码后立即发出第一个元素,而不是在Future完成之前等待最后一个数据包到达。

反应性交易包含了这一事实。 与命令式事务类似,事务在实际工作之前开始。 当我们通过事务工作产生数据时,数据在事务处于活动状态时流经Publisher 。 这意味着在活动事务期间数据会逸出我们的@Transactional方法。 更详细地看,我们将认识到@Transactional方法只是反应性序列中的标记。 我们在方法上考虑不多; 我们宁愿只观察订阅和完成过程中发生的影响。
如果在事务处理过程中发生任何错误,则在实际事务回滚的同时,我们可能会保留在事务内处理的数据。 这是您的应用程序中要考虑的事情。
通过意图进行的反应式事务管理不会延迟排放,而不会忽略流属性。 原子性在应用程序中的权重比流技术高,这是您可以在应用程序中处理的事情。 否则,您将获得反应式数据流的全部功能。

(B)锁定

从Java的角度来看,使用R2DBC进行的反应性数据库访问是完全非阻塞的。 所有I / O都使用非阻塞套接字进行。 因此,您从R2DBC获得的是I / O不再阻塞您的线程。 但是,反应性关系数据库驱动程序符合数据库通信协议并遵守数据库行为。
尽管我们不再占用Thread ,但仍然占有数据库连接,因为这是RDBMS的工作方式-通过命令发送命令。 一些数据库允许进行轻微的优化,称为流水线。 在流水线模式下,驱动程序将继续向连接发送命令,而无需等待上一个命令完成。

通常,在以下情况下可以释放连接:

  1. 一个语句(多个语句)已完成
  2. 申请交易完成

我们仍然可以观察到锁定会阻止连接。

数据库锁

根据您使用的数据库,您可以观察MVCC行为或阻止行为,通常是事务锁定。 对于命令式SQL数据库事务,我们通常以两个(b)锁结束:

  1. 应用程序线程被I / O阻止
  2. 数据库锁

仅当数据库释放其锁时,我们的应用程序才能继续运行。 释放锁还可以解除对应用程序线程的阻塞。
由于非阻塞的I / O,使用反应式数据库集成不再阻塞应用程序线程。 数据库锁定行为保持不变 。 而不是阻塞两个资源,我们最终得到了阻塞的数据库连接。

从Java的角度来看,TCP连接便宜。

由于SQL数据库是如何工作的,我们仍然可以获得强大的一致性保证。

符合ACID的数据库是否天生就不会发生反应?

关于SQL数据库和响应式有以下三种观点:

  • 锁定:谈论反应式时,SQL数据库并不是最佳的持久性机制。 许多数据库在运行更新时执行内部锁定,因此并发访问受到限制。 某些数据库应用了MVCC ,从而使锁定效果更小。 无论如何,繁重的用例可能不太适合您的响应式应用程序,因为对于传统的SQL数据库,这可能会导致可伸缩性瓶颈。
  • 可伸缩性:SQL数据库的伸缩性通常比NoSQL差,在NoSQL上,您可以再放置50台计算机来扩展群集。 借助RedShift,CockroachDB,Yugabyte之类的新SQL数据库,我们可以比传统SQL数据库进行不同的扩展和更好的方式。
  • 游标:许多SQL数据库在其有线协议中都具有响应功能。 这通常类似于分块读取。 运行查询时,响应式驱动程序可以通过获取少量结果以使驱动程序不致从游标中读取结果。 读取第一行后,驱动程序就可以将该行向下发送给其使用者,然后继续进行下一行。 一旦处理了块,驱动程序就可以开始处理下一个块。 如果取消订阅,驱动程序将停止从游标读取并释放它。 这是一个非常强大的安排。

真的有性能优势吗?

性能是一个巨大的领域。 在本文的背景下,让我们关注资源使用和吞吐量。

您不需要对吞吐量做出反应。 您这样做是为了实现可伸缩性。

有些影响会完全基于背压影响吞吐量。 背压是指Subscriber可以通过向其Publisher者报告所请求的条目数来一次处理多少条目的概念。 知道应用程序需要多少行的背压允许被动驱动程序应用智能预取。
命令性驱动程序通常在前一个数据完成处理时获取下一个数据块。 阻塞驱动程序将阻塞基础连接和线程,直到数据库答复为止( 命令获取模型 ,请求之间的白色区域是等待时间)。
知道客户端需要多少数据,可以让反应性驱动程序在应用程序处理前一个数据块时提取下一个数据块( 反应式提取模型 ,其中将等待时间降至最低)。

就资源使用而言,反应性驱动程序不会阻塞线程。 一旦从网络流中解码出行,它们就会发出接收到的行。 总而言之,它们在实现过程中带有GC友好的执行模型。 在组装期间,GC压力增加。

结论

您已经了解了命令式和反应式数据库属性。 事务管理需要在命令性流程中实现,而与反应式代码不同。 实现的更改反映出运行时行为略有不同,尤其是在涉及数据转义时。 通过更改有关延迟和资源使用的性能配置文件,您可以获得相同的强大一致性保证。

注意:程序性交易管理是有意省略的,因为本文概述了交易管理的内部原理以及命令式交易与反应式交易之间的差异。

翻译自: https://www.javacodegeeks.com/2019/05/reactive-relational-database-transactions.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04 服务器版安装

本篇文章是实验室服务器安装系统的总结安装总结。 1 安装的前提是具有安装启动盘,下载最新的Ubuntu 20.04服务器版本系统,制作成可启动的USB驱动器。 不同品牌的电脑安装系统的启动键不同,需自行百度一下自己要装的计算机的启动键。 1 进入引…

Window10:不能建立到远程计算机的连接。你可能需要更改此连接的网络设置。

解决步骤: 第一步:在桌面找到此电脑,鼠标右键点击,选择管理 第二步:进入计算机管理界面 第三步:点击设备管理器-再点击网络适配器 第四步:卸载WAN MIniport(ip) 重启电脑。重新拨号&…

java默认代码地址_Java 8默认方法可能会破坏您的(用户)代码

java默认代码地址乍一看, 默认方法为Java虚拟机的指令集带来了一个很棒的新功能。 最后,库开发人员能够开发已建立的API,而不会对其用户代码造成不兼容性。 使用默认方法,当将新方法引入该接口时,任何实现库接口的用户…

C盘爆红的解决方法

C盘爆红的原因 1. 系统存在的过多功能 2. 安装的软件占用 3. 聊天软件文件占用 4. 临时文件占用 5. 软件缓存占用 针对不同的原因进行处理 一.关闭不用的系统功能 1. 从1903版本开始,win10 C盘就有~7G的保留空间占用; 提供dism命令关闭方法,命令…

Apache Camel 3 –骆驼核心vs骆驼核心引擎(较小的核心)

Camel团队目前正在忙于Apache Camel 3的开发。已经完成了许多工作,到目前为止,我们已经发布了3个里程碑版本。 下一个里程碑版本4具有一些出色的创新功能,这些功能我将在接下来的几个月中发布。 该博客的主题是我们在将骆驼核拆分成较小的模…

OneNote使用说明

Microsoft OneNote,是一套用于自由形式的信息获取以及多用户协作工具。OneNote最常用于笔记本电脑或台式电脑,但这套软件更适合用于支持手写笔操作的平板电脑,在这类设备上可使用触笔、声音或视频创建笔记。 感觉onenote就像纸质的笔记本&…

雷柏MT750S鼠标使用总结(驱动|连接|模式|续航)

【什么值得买 摘要频道】下列精选内容摘自于《无线办公好帮手 雷柏MT750S无线蓝牙鼠标体验》的片段: 驱动 雷柏MT750S的驱动软件界面比较简单,因为没有灯光的原因,软件主要是鼠标按键功能的设置,在左侧显示了各种功能&#xff0c…

1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图

1.0jpa 2.0延迟加载通常是JPA 2.0的问题。 如果要使用FetchType.LAZY(默认)或FetchType.EAGER来加载关系,则必须在实体上进行定义,并且始终使用此模式。 仅当我们要始终加载关系时才使用FetchType.EAGER。 在几乎所有情况下都使用…

Notion,程序员最后一款笔记软件

市面上笔记软件五花八门,都各有特色。wolai、语雀、飞书、印象笔记、石墨、幕布、为知笔记.....等等,数不胜数,但我最终选择了notion,因为它实在太好用了!!!如果你之前没使用过,赶紧…

通过Main的Checkpoint Restore加快Java启动速度

Java虚拟机为已编译为字节码 (但不一定是用Java编写)的应用程序提供了托管运行时环境。 与为特定平台静态编译的代码相比,这为应用程序开发人员提供了许多好处,并且通常可以提高性能。 JVM通过垃圾回收器 (GC&#xff…

notion常用快捷键

由于我自己的电脑是window10系统,我也就只整理window系统的快捷键。notion官网上有全部快捷键的教程,链接如下: https://www.notion.so/Learn-the-shortcuts-66e28cec810548c3a4061513126766b0 这篇博客来自于我的CSDN账号,里面…

“操作无法完成因为其中的文件夹或文件已在另一个程序中打开”解决办法

在windows系统中,我们经常会遇到这样一个问题:删除某一个文件或者文件夹,被提醒:操作无法完成,因为其中的文件夹或文件已在另一个程序中打开。 这个时候我们一般会先检查是否真的有程序或者文件打开了没有关闭&#xf…

带有AngularJS资源的Spring Rest Controller

Angularjs ngResource是用于与基于REST的服务进行交互的angularjs模块。 我最近在Spring MVC的一个小型项目中使用了它,并希望记录一个对我来说很好的配置。 该控制器在工厂中运行,它支持在Hotel实体上进行CRUD操作,并支持以下方法&#xff…

【CLion】如何编译运行单个文件 (C/C++ Single File Execution插件的使用)

如果你知道如何使用 C/C Single File Execution 插件但仍然无法找到运行按钮 请直接看第五张图片 一、 这里我首先新建了一个项目,名为Demo 又在项目文件夹内新建了一个代码文件,名为TestCode 二、 然后在 File - Settings - Plugins 中搜索 C/C Single…

使用Mocks进行需求驱动的软件开发

jmock作者撰写的有关模拟框架的优秀论文 。 本文写于18年前的2004年,但其中有许多构建可维护软件系统的技巧。 在这篇文章中,我将重点介绍本文中的关键思想,但建议您阅读本文,以获取有关模拟和编程实践的重要思想。 模拟对象是测…

W10关闭警告声音

点击电脑左下角的“开始”按钮 在开始菜单中点击打开“设置” 在设置窗口中点击“个性化” 在轻松使用界面左侧点击“主题” 接着在右侧找到并点击“声音” 在弹出的窗口中点击“声音方案”下面的方框 在弹出的列表中选择“无声”,点击底部的“应用”和…

Ubuntu常用快捷键

命令行中快捷键 Tab 自动补全 Ctrla 光标移动到开始位置 Ctrle 光标移动到最末尾 Ctrlk 删除此处至末尾的所有内容 Ctrlu 删除此处至开始的所有内容 参考 Ubuntu 快捷键命令_糖糖糖-豆的博客-CSDN博客_ubuntu命令行快捷键

camel 调用soap_使用Apache Camel通过soap添加WS-Security

camel 调用soapWS-Security(Web服务安全性)是一个协议,可让您保护自己的soap Web服务。 发出Soap请求的客户端必须在Soap标头中提供登录名和密码。 服务器接收到肥皂请求,检查凭据并验证请求是否正确。 使用Apache Camel&#xf…

Typora中插入分页符

由于typora基于html&#xff0c;插入分页符的方法&#xff08;在导出成PDF时生效&#xff09;&#xff1a; <div style"page-break-after:always"></div>

使用Spring Boot Actuator监视Java应用程序

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 您是否曾与Spring Boot Actuator合作&#xff1f; 这是一个非常有用的库&#xff0c;可帮助您…