- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
分布式事务未提交 是应用程序出现宕机异常的很重要的一原因.
应用宕机主要可以分为:
1. 内存泄露导致的OOM宕机. 表现在系统越来越慢, 应用的内存和CPU占用量越来越高. 最终达到无响应的状态, 此时数据库一般是正常的.
2. 分布式事务未提交导致的宕机, 表现在无法建立新的连接, 会出现连接池满,或者超时等的现象. 数据库的压力会比较大, 应用的压力一般不会很高.
3. 线程池泄露导致的栈溢出问题, 一般表现在线程/线程池处理不规范, 创建后没有做清理处理, 导致线程堆积, 非堆区超过上下, 出现栈溢出或者是OOM溢出.
这种现象下堆区内存较为正常, 但是非堆区会比较异常.
4. 异常代码导致的宕机,比如死循环, 笛卡尔积, 大数据量下的未分页,全部积压到JVM的堆区内存中.
5. 第三方库的异常, 比如json解析过大, 影像图片解析异常, excel解析异常(错误的格式或者是16k*20k的渲染), 错误文件导致的解析死循环.
6. 服务器系统配置不规范,应用配置不规范, 比如nofile, 内存限制, 过低,过于严格, IO突然的降低导致延迟增加或者是延迟热加载时文件加载失败(损坏,不完整等),或者是重复加载. 内存,文件连接不释放
本次问题出现的范围比较广, 原因也比较复杂, 这里仅分析与思考一下一个事务相关的问题.
其他的比如 数据库参数配置, 大表的批量更新与删除, 索引的过多,不完整等问题暂时不深入.
OLTP的环境下, 事务的处理必须是短促的. 要占用尽可能少的数据库时间与资源.
在提交事务后, 应该尽快的执行commit 或者是 rollback.
避免占用过多,过久的数据库的资源.
TCP连接/Session/Process 是数据库资源
Lock/latch/ 也是数据库资源.
数据文件写入/redo/undo的写入, 归档的写入, 更数据库资源.
SQL解析,SQL执行,排序,关联 等等 都是数据库的资源.
事务未提交, 主要会占用 网络,session, 以及lock相关的资源.
他会锁住要执行变更的部分行信息.
并且因为不提交, 这个数据库连接不能被复用. 应用服务器的连接池值能够继续创建新的连接.
这就会导致:
1. 创建TCP连接.数据库创建process. 创建session 是很重的操作, 会耗时比较久, 高并发的情况下基本上是秒级操作.
2. 提交事务的时间越久, 其他用户需要的连接越多, 建立的连接的效率就会越低. 会进入螺旋上升的性能屏障.
3. 建立Process和Session, 数据库会分配内存和CPU资源, 会导致数据库的负载上升, 响应能力下降.
4. 数据库的性能下降会导致本来可以很快提交的动作变的更慢. 导致真个流程变的更加漫长.
分布式事务未提交是不可接受的.
事务提交逻辑复杂也是不可接受的.
1. 开启事务后要尽快提交, 不要有太过复杂的逻辑处理, 不要一次性修改更多的数据, 尤其不要有大表的not in 批量处理等.
2. 开启事务后, 必须有finally , 能够catch 住异常, 并且执行rollback等操作, 避免事务处理时异常数据导致不提交,出现异常卡顿.
3. 不建议在开启事务后有非关键核心的表处理, 比如临时表, 排序,大表的数据检索与验证等. 避免提交事务变慢. 需要插入修改删除的数据需要再事务开启之间准备好.
4. 开启连接池,并且适当设置连接池的大小. 尤其不要过高, 过高在遇到事务问题时会将数据库的资源耗尽, 过低会导致无法满足业务需求.
应用服务器的线程数可以理解为干活的人数.
对应数据库的连接数可以理解为工人交付工作成果的窗口.
干活的人数跟车间的大小相关(CPU和内存) 设置的太小了, 吞吐量会比较小.
但是设置的太大了, 会出现线程上下文切换, 出现等待事件,并且占用比较多的CPU和内存资源.
所以线程池的设置 要根据应用服务器的配置, 以及业务场景的逻辑来进行设置.
如果资源比较少, 并且业务逻辑处理比较快, 并发要求不是特别高, 可以适当减少线程池的大小.
如果对并发和吞吐量要求特别高, 那么必须要加大配置. 增加线程池.
连接池就像是线程池干完活后用于提交工作成果的.
如果成果比较简单, 可以快速的提交和释放, 那么数据库连接池可以比较小一些.
如果提交的工作比较复杂, 时间很久, 需要较高的连接池数量.
需要注意, 如果连接池多了, 应用服务器需要关联较多的对象, 内存,CPU和切换起来都可能会慢.
数据库对应更多的应用, 他会产生更大的压力. 虽然有epoll等网络模型
但是100个并发和1000个并发对数据库产生的压力是非常不一样的.
所有放之四海皆准的配置, 需要根据业务场景,数据量, 应用和数据库的配置进行关联思考设置出最合适的配置来.
最后此篇关于分布式事务提交慢的一次总结和思考的文章就讲到这里了,如果你想了解更多关于分布式事务提交慢的一次总结和思考的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
假设我有一个带有隐藏提交按钮的表单,我在其中输入值,然后我点击一个按钮,就会出现带有确认消息和确认按钮的对话框。当我单击“确认”按钮时,我还单击了表单中隐藏的提交按钮。这可能吗?我如何在 JQuery
我们正在学习 Git 并使用 GitHub 作为我们的托管站点。 我们都 fork upstream repo 并 PR 我们的提交到 upstream 以获取我们的更改。 我们正在努力学习如何压缩我
我只需要一些关于这段代码的帮助。 var prv3; var markIt3 = function(e) { if (prv3 === this && this.checked) { th
如果 1 个表单使用“GET”方法而另一个使用“POST”方法,我如何提交位于同一页面上的 2 个表单。每个表单都有相同的操作并转到相同的下一页。需要帮忙。感谢大家的帮助。 我怎样才能得到下面这两个使
您好,我的表单中有以下脚本 function pdf() { var frm = document.getElementById("form1"); frm.action = "http://www.
我有一个 iOS 胖静态库(iphoneos 和 iphonesimulator),如果我在应用程序提交期间使用它,它会因为二进制文件包含 iphonesimulator 代码而失败吗? 最佳答案 我
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我正在尝试发送由 jquery 创建的表单。该表单附加到一个 div 中,下面的变量“data”是使用 php 创建的,我将只发布最重要的 js 代码。 我尝试了很多带有和不带有“on()”的操作,但
我面临一个简单的问题,但不知道如何解决。我正在使用 twitter bootstrap 的标签。选项卡有效,但每个选项卡中的表单不提交。表单在没有选项卡的情况下提交。 以下是我用于标签的链接
我的计算机上有 140 个 git 存储库,每周我可以处理其中 10-15 个。有没有办法知道是否忘记提交/推送我的一个项目? 这些存储库都位于同一位置:“C:/Projects”。 输出类似于 C:
我对 javascript 完全陌生,目前正在开发我的第一个函数。我有这 2 个文本输入区域,可以在其中输入他的姓名和级别。 Nom: Niveau (1 á 6): 提交后,
我安装了最新的 Docker CS,得到了 LAMP image来自 Docker 集线器。我正在尝试在其中创建一个数据库并使用保存在其中的数据库制作一个新图像。 启动容器:docker run --
我有这个 jQuery 简单代码: 由于某种原因,submit() 无法正常工作(我的表单在单击 old_thumb 按钮后未提交。有人可以帮助我吗? 这里是 html 的一部分(它很长
如何获得 input type="submit"onclick 事件来触发 commitfunds.valdiate?我不能使用类或 ID。它必须是一个 onclick 事件。 这是代码: row A
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
来自 this earlier thread我以为我知道可以使用 javascript submit() 命令通过 POST 方法发送表单数据。但我无法让它工作。这个演示在目的方面没有明显的意义,但请
在 mysql 重新启动时提交 XA 待处理事务时,出现以下错误。请帮助我解决这个错误。 mysql> XA RECOVER CONVERT XID; +----------+------------
我有一个带有 的表单. 如果启用了 Javascript,我将删除此 submit -输入字段$('#no-js-submit').remove();并添加“fire-ajax”按钮 $('Fire
我希望在页面加载后提交此表单,并且我使用了以下代码来完成此操作。问题是页面不断重新加载并停留在该循环中。 HTML Select Genre
我们有一个表单,其中有几个单独的提交按钮,它们执行不同的操作。问题是我有几个具有以下 HTML 的按钮: 现在您无法使用标准的 find_control 函数按值定位元素。所以我写了一个谓词函数来
我是一名优秀的程序员,十分优秀!