一、背景
今天@无聊之园提出 一个问题 “手动将多个数据库事务提交和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