事务手动提交和XA事务问题及思考

简介: 事务手动提交和XA事务问题及思考

一、背景

今天@无聊之园提出 一个问题 “手动将多个数据库事务提交和XA效果类似,比如事务A,事务B一起提交,前面报错就一起回滚,否则一起先后执行提交”。除非是提交的时候会有失败的可能,否则没有问题。引发了技术群里进行了一番探讨。



那么事务提交的时候会失败吗?哪些情况下会失败??


XA事务的目的是啥,使用场景是啥?


通过这些对我们的学习和求职又能够带来何种启发?


二、研究

2.1 SOF上一个类似的问题 “Can a COMMIT statement (in SQL) ever fail? How?”

https://stackoverflow.com/questions/3960189/can-a-commit-statement-in-sql-ever-fail-how


OMMIT may fail. You might have had sufficent resources to log all the changes you wished to make, but lack resources to actually implement the changes.


And that's not considering other reasons it might fail:


The change itself might not fit the constraints of the database.


Power loss stops things from completing.


The level of requested selection concurrency might disallow an update (cursors updating a modified table, for example).


The commit might time out or be on a connection which times out due to starvation issues.


The network connection between the client and the database may be lost.


And all the other "simple" reasons that aren't on the top of my head.


列举了五几种情况,其中包括不符合数据库的约束,断电,并发更新问题,提交超时,网络中断等。


《org.hibernate.TransactionException: commit failed》更是印证了这个说法。


2.3 事务被kill

之前开发的时候公司运维系统对超过某个执行时间的线程就会kill掉。


假如这个时候第一个事务提交成功后第二个事务还没来得及提交就被kill,显然也会提交失败。



因此手动多个事务一起提交不太靠谱,无法可靠的保证事务的一致性。


三、延伸

3.1 XA事务相关好文

《XA 事务处理》https://www.infoq.cn/article/xa-transactions-handle 对XA事务给出了详细的讲解。


X/Open XA 接口是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁。


事务管理器控制着 JTA 事务,管理事务生命周期,并协调资源。在 JTA 中,事务管理器抽象为 javax.transaction.TransactionManager 接口,并通过底层事务服务(即 JTS)实现。


资源管理器负责控制和管理实际资源(如数据库或 JMS 队列)。


下图说明了事务管理器、资源管理器,以及典型 JTA 环境中客户端应用之间的关系:




————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/91407315

相关文章
|
5月前
|
SQL Oracle 关系型数据库
第7章 事务
第7章 事务
31 0
|
7月前
|
存储 Java 中间件
事务一致性测试
事务一致性测试
60 0
|
7月前
|
SQL 前端开发 大数据
什么是大事务?以及大事务产生的问题
什么是大事务?以及大事务产生的问题
203 0
|
存储 Oracle 固态存储
深入理解事务
事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑执行单元。即事务中的所有读写是一个执行的整体,整 个事务要么成功(提交)、要么失败(中止 或者 回滚)。如果失败,应用程序可以安全地重试。
16447 0
深入理解事务
|
人工智能 关系型数据库 MySQL
事务详解
事务是逻辑上的一组操作,要么都执行,要么都不执行。
80 0
|
SQL 存储 关系型数据库
|
SQL Java 大数据
事务详解(2)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
173 1
|
数据库
什么时候需要使用事务
什么时候需要使用事务
638 0
|
Oracle 安全 Java
事务详解(1)
你好看官,里面请!今天笔者讲的是事务。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
113 2
|
SQL 存储 Oracle
事务是什么
事务是什么