数据源面试三连杀:是啥?为什么要用?怎么用? (2)

javax.transaction.Transaction,代表了一个物理意义上的事务,在开发人员调用UserTransaction.begin()方法时TransactionManager会创建一个Transaction事务对象,

javax.transaction.xa.XAResource,面向提供商的实现接口,是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。提供商在提供访问自己资源的驱动时,必须实现这样的接口。

开发者调用UserTransaction.begin方法时,因为UserTransaction的实现类持有TransactionManager,TransactionManager充当UserTransaction和Transaction之间的桥梁,所以在调用UserTransaction的begin方法时,TransactionManager会创建Transaction事务对象,并把此对象通过ThreadLocal关联到当前线程。当调用UserTransaction其他方法时,会从当前线程取出事务对象Transaction对象,并通过Transaction对象找到与其关联的XAResource对象,然后进行commit、rollback等操作。其基本流程如以下代码:

// 创建一个Transaction,挂到当前线程上 UserTransaction userTx = null; Connection connA = null; Connection connB = null; try{ userTx.begin(); // 将Connection对应的XAResource挂到当前线程对应的Transaction connA.exec("xxx") connB.exec("xxx") // 找到Transaction关联的XAResource,让它们都提交 userTx.commit(); }catch(){ // 找到Transaction关联的XAResource,让它们都回滚 userTx.rollback(); } 4.2 如何使用J2EE的分布式事务

WebLogic、Websphere、JBoss等主流的应用服务器提供了JTA的实现和支持。

Tomcat中没有提供JTA的实现的,这就需要借助第三方的框架Jotm、Automikos等来实现。

五、总结

本文主要介绍了数据源和XA数据源,以及分布式事务基本原理、作用和场景以及如何使用J2EE分布式事务,但这种是属于基于资源层的底层分布式事务解决方案,在业内,用来解决分布式事务的方案还有柔性事务,柔性事务包括几种类型:两阶段型、补偿型、异步确保型和最大努力通知型,有兴趣可以更深入的了解一下。

六、参考

https://dzone.com/articles/datasources-what-why-how

https://searchoracle.techtarget.com/news/918695/Data-sources-What-how-and-why

https://docs.oracle.com/javase/7/docs/api/javax/sql/CommonDataSource.html

https://blog.csdn.net/conquer0715/article/details/50925674/

https://www.ibm.com/developerworks/cn/java/j-lo-jta/

https://www.dazhuanlan.com/2019/12/17/5df7d87d35561/

作者 | Karina Varela · Jun
翻译 | 小青菜
来源 | https://dzone.com/articles/datasources-what-why-how
本文有spring4all技术翻译组完成,更多国外前沿知识和干货好文,欢迎关注公众号:后端面试那些事儿。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzwyg.html