聊聊数据库事务内嵌TCP连接
最近再看项目代码,发现很多的service里面,喜欢在事务内部再去调用HTTP请求,简单分析下此种方式的利弊与解决策略。
概述
在数据库内部嵌套TCP连接(一般是HTTP调用或是RPC远程调用)。
@Transactional(rollbackFor = Exception.class)
public Boolean inviteUser(..){
// service 调用
userService.add(..);
// HTTP调用
httpClient.post(..,20)
}
优点:
- 保障两个操作间的原子性、隔离性。
- 事务控制: 建立TCP连接可以使数据库管理系统更好地控制和监视事务。它可以跟踪连接的状态和事务的执行进度,从而更容易实现事务管理和恢复。
- 性能优化: 内部TCP连接可以针对特定的事务进行性能优化。例如,可以为事务分配更多的系统资源,以提高其执行速度。
- 安全性: 内部TCP连接可以通过加密和认证来增强安全性,确保只有授权的用户或应用程序能够访问数据库
弊端:
- TCP连接可能会超时,导致事务变成长事务。
- 网络抖动出现异常,可能会导致前一个正常的操作回滚。
- 资源消耗: 每个TCP连接都需要消耗系统资源,包括内存和处理能力。在高负载情况下,内部建立TCP连接可能导致资源耗尽,影响其他事务的执行。
- 连接维护开销: 维护大量的TCP连接可能会增加数据库管理系统的开销。每个连接都需要管理、维护和监视,这可能会导致性能下降。
- 复杂性: 内部TCP连接引入了更复杂的架构,需要更多的管理和维护工作。这可能需要更多的开发和管理工作,并增加了系统的复杂性。
- 连接延迟: 建立和维护TCP连接需要时间,这可能会导致事务的启动延迟。对于需要快速响应的事务,这可能是一个不利因素。
解决方案
评估审视多个操作调用之间是否有强一致性。
- 有强一致性
必须手动开启事务,根据HTTP调用的返回码进行手动事务提交或回滚。事务传播级别,尽量使用当前事务。
- 无强一致性
手动开启事务,或是使用自动事务注解,但最后可以通过事件监听器回调事务接口的afterCommit方法,再进行HTTP调用。事务传播级别,尽量使用当前事务。
聊聊数据库事务内嵌TCP连接的更多相关文章
- 关于Spring事务的原理,以及在事务内开启线程,连接池耗尽问题.
主要以结果为导向解释Spring 事务原理,连接池的消耗,以及事务内开启事务线程要注意的问题. Spring 事务原理这里不多说,网上一搜一大堆,也就是基于AOP配合ThreadLocal实现. 这里 ...
- mongodb 多表关联处理 : 内嵌以及连接(手动引用、DBref) 、aggregate中$lookup
MongoDB与关系型数据库的建模还是有许多不同,因为MongoDB支持内嵌对象和数组类型.MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).那么何时Embed何时Li ...
- 放开Linux内核对用户进程可打开文件数和TCP连接的限制
一. 检查linux内核uname -alsb_release -a 二. 用户进程可打开文件数限制1) vim /etc/security/limits.conf* - nof ...
- Angular 内嵌视图、宿主视图
解析视图: 内嵌视图 - 连接到模板的嵌入视图,在组件模板元素中添加模板(DOM元素.DOM元素组) 宿主视图 - 连接到组件的嵌入视图,在组件元素中添加别的组件 使用类说明: ElementRef ...
- 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总
本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...
- H2内嵌数据库的使用
H2内嵌数据库的使用 H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制. 同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容. H2还提供兼容模式,可以兼容一些主流 ...
- 补习系列(17)-springboot mongodb 内嵌数据库
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- SpringBoot内嵌数据库的使用(H2)
配置数据源(DataSource) Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法. 传统做法是, 一个DataSource使用一个URL以及相应的证书去构 ...
- SpringBoot使用H2内嵌数据库
1.驱动 我们知道,JDBC是JDK自带的接口规范,不同的数据库有不同的实现,只需要引入相应的驱动包即可. 在使用MySQL数据库时,引入的是MySQL驱动,相应的,使用H2数据库时,也需要引入H2驱 ...
随机推荐
- Win10环境配置(二) ——Java篇
Win10环境配置(二) --Java篇 1.工具准备 官网下载地址:[jdk-11.0.11](Java SE Development Kit 11- - Downloads (oracle.com ...
- 【Python】sqlmodel: Python 数据库管理ORM 的终极形态?
ORM 大家都知道ORM(Object Relational Mapping)是一种将对象和关系数据库中的表进行映射的技术,它可以让开发者更加方便地操作数据库,而不用直接使用SQL语句. 直接使用SQ ...
- Python运维开发之路《WEB框架:Django》
一.Web框架的本质 所有的web框架.web请求:本质上都是:socket 浏览器:socket客户端 服务器:socket服务端 1. socket服务端 import socket def ha ...
- 无缝数据转换!使用C++ 实现 Excel文件与CSV之间的相互转换
CSV格式是一种通用的文本文件格式,可在多个应用程序之间共享和使用.相比之下,Excel文件是一种电子表格格式,通常只能在Microsoft Excel中编辑和查看.因此,将Excel文件转换为CSV ...
- 免费好用的录屏工具 —— EVCapture --九五小庞
下载地址:https://wwfv.lanzoue.com/b022u08ib密码:acdu 1,简介 使用过很多种屏幕录像软件,最终这个软件留下来存到我的工具宝库. 因为界面非常简单友好,功能也很好 ...
- asp.net core之Startup
Startup介绍 Startup是Asp.net Core的应用启动入口.在.NET5及之前一般会使用startup.cs类进行程序初始化构造.如下: public class Startup { ...
- TFS 更换电脑名称后映射失效
TFS 更换电脑名称后映射失效 建议不要随便更改电脑名 环境 Visual Studio 2019 : Win10 操作步骤 查找 TFS 的相关配置文件.如果你知道你之前的电脑名字可以跳过这一步:如 ...
- 【游记】NOI 2023省选游记
Day -N 下午去机房训练,回去的时候邱大大说 "我\(,lj,szy\) 可以去参加 NOI 2023省选".我瞬间就惊了.作为一个 \(CSP-S\) 只有 \(91pts\ ...
- 管于pyinstaller 打包完成后不能运行的问题
方案一: 进入项目路径,在cmd窗口输入python 文件名.之后查看结果,看是否有模块未安装,或者是未导入模块.因为pyinstaller打包时,是按照被打包文件上的导入的库名进行打包的,所以需要将 ...
- Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明 Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改 Hi3798MV200 恩兔N2 NS ...