react提交数据到数据库_React型关系数据库事务

react提交数据到数据库

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

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

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

让我们先来看命令式事务。

命令性交易

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

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

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

资源绑定

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

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

React性交易

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

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

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

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

(B)锁定

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

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

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

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

数据库锁

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

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

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

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

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

符合ACID的数据库在设计上是天生没有React性的吗?

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

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

真的有性能优势吗?

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

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

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

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

结论

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

注意:程序性交易管理被有意地排除在外,因为本文概述了交易管理的内部原理以及命令式交易与React式交易之间的差异。

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

react提交数据到数据库

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

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

相关文章

实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)

【-1】写在前面: 以下部分内容总结于 http://blog.csdn.net/ruyanhai/article/details/7181842 complementary: 兼容性是指运行在前期CPU,如8086/8088上的的程序,也可以运行在其以后的处理器,如80286上; 【0】看看in…

Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?

先来解释一下这三种编码的历史吧: ANSI:最早的时候计算机ASCII码只能表示256个符号(含控制符号),这个字符集表示英文字母足够,其中,我们键盘上可见的符号的编码范围是从32到126(大小…

python编程、abc最大值_Python中abc

import abc指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化class Animal(metaclassabc.ABCMeta): # 统一所有子类的方法abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法def say(self):print(‘动物基…

(实模式+保护模式)模式切换的过程步骤(代码+文字解析)

【0】写在前面 文末的个人总结是干货,前面代码仅供参考的,且source code from orange’s implemention of a os. ; ; pmtest2.asm ; 编译方法:nasm pmtest2.asm -o pmtest2.com ; %include "pm.inc" ; 常量, 宏, 以及一些说…

骆驼(camel)命名法_Apache Camel 3 –骆驼核心vs骆驼核心引擎(较小的核心)

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

Maven的依赖插件

文章目录mvn dependency:copy-dependenciesmvn dependency:treemvn dependency:listmvn dependency:copy-dependencies 导出项目所依赖的所有 jar 包,默认导出到 target/dependency 目录中。 1.第一种方式 在命令终端中,进入 pom.xml 所在的目录&…

安装telnet_Flask干货:Memcached缓存系统——Memcached的安装

图 | 源网络文 | 5号程序员Memcached缓存系统是目前使用最广泛的高性能分布式内存缓存系统,是一个自由开源的高性能分布式内存对象缓存系统。国内外众多大型互联网应用都选择Memcached以提高网站的访问性能。缓存系统一般可以将一些不需要实时更新但是又极其消耗数据…

jep和jsr_候选JEP:记录和密封类型

jep和jsr马克莱因霍尔德(Mark Reinhold )本周在OpenJDK琥珀色开发者邮件列表上宣布了两个新的紧密相关的候选 JDK增强提案( JEP) ,其帖子分别为“ 新候选JEP:359:记录(预览&#xff…

局部描述符表LDT的作用+定义+初始化+跳转相关

【0】写在前面 0.1)本代码的作用: 旨在说明局部描述符表的作用,及其相关定义,初始化和跳转等内容; 0.2)文末的个人总结是干货,前面代码仅供参考的,且source code from orange’s i…

ServletContext的学习笔记(属Servlet学习课程)

文章目录ServletContext 简介获取 ServletContext 对象功能获取 MIME 类型用来共享数据获取文件在服务器主机的物理路径获取全局级别的初始化参数获取临时目录ServletContext 简介 web 服务器在启动时,会为每一个已经部署的应用创建唯一的一个 ServletContext 实例…

开发罪过_七大罪过与如何避免

开发罪过在整个本文中,我将在代码片段中使用Java,同时还将使用JUnit和Mockito 。 本文旨在提供以下测试代码示例: 难以阅读 难以维护 在这些示例之后,本文将尝试提供替代方法,这些替代方法可用于增强测试的可读性&…

调用门的定义+调用

【0】写在前面 0.1)本代码,添加了门描述符的相关代码,旨在说明 怎样 对门转移的目标段 进行定义,调用;0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅;0.3)文末总…

小学生图片_中秋节手抄报,小学生中秋节手抄报图片大全

月饼,或叫中秋饼,是东亚各地的中秋节食品,越南称为饼中秋(Bnhtrungthu)。中秋节吃月饼的习俗于唐朝开始,北宋之时,月饼被称为“宫饼”,在宫廷内流行,也流传到民间,俗称“小饼”和“月…

Response的学习笔记(属Servlet学习课程)

文章目录Response设置响应消息数据1.设置响应行2.设置响应头3.设置响应体案例1.重定向2.输出字符数据到 Response 对象乱码的问题解决办法一解决办法二3.输出字节数据到 Response 对象4.验证码案例继承与实现体系Response 该对象的功能就是用来设置响应消息(响应报…

如何写一个高效进程/线程池_关于高效企业测试的思考(1/6)

如何写一个高效进程/线程池企业中的测试仍然没有得到应有的广泛应用。 编写尤其是维护测试需要花费时间和精力,但是缩短软件测试并不是解决方案。 为了提高测试效率,应该追求哪些范围,方法和测试技术? 基于许多实际项目&#xff…

智能音箱音效哪个好_华为支浩:音质好是底线,AI基本功扎实让智能音箱不再是“玩具”...

2020年,智能音箱市场的仗已经打了六年。立足国内,抑或放眼国际,似乎都是胜负已分,江山已定。可就在此时,一位“搅局者”闯入了大家视野。10月30日,华为年度旗舰新品发布会在上海举行。会上,华为…

JS(JavaScript)给元素绑定事件/给元素注册事件处理程序/给元素注册事件监听器

文章目录不使用 jQuery&#xff0c;给元素注册事件监听器通过jQuery给元素注册事件监听器通过标签的属性来注册事件监听器不使用 jQuery&#xff0c;给元素注册事件监听器 <script type"text/javascript">window.onload function () {alert("test"…

ssh无密码登陆权威指南

##【0】写在前面 ###由于ssh 实现的是免密码登陆&#xff0c;大致步骤是&#xff1a; 0.1&#xff09; client通过ssh登陆到server&#xff1b;0.2&#xff09; server检查家目录下的.ssh文件&#xff0c; 并发送公钥文件 authorized_keys 到client &#xff1b;0.3&#xff0…

java 十六进制浮点_Java十六进制浮点文字

java 十六进制浮点我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能&#xff0c;以减少代码重新格式化的可能性。 如果重新格式化&#xff0c;当前版本的代码将覆盖原本相同的代码。 这很烦人&#xff0c;因为按下重新格式化键的快捷键相当容易&#xff0c;而且许…

python时间倒计时显示屏厂家_python 实现倒计时功能(gui界面)

运行效果&#xff1a;完整源码&#xff1a;##import libraryfrom tkinter import *import timefrom playsound import playsound## display windowroot tk()root.geometry(400x300)root.resizable(0,0)root.config(bg blanched almond)root.title(techvidvan - countdown cloc…