JTA和本地交易有什么区别?
一个显示何时使用JTA以及何时使用本地事务的示例很好。
Answers:
JTA
是用于管理Java中事务的通用API。它允许您以资源中立的方式启动,提交和回滚事务。事务状态通常存储在TLS(线程本地存储)中,并且可以传播到调用堆栈中的其他方法,而无需传递某些显式上下文对象。交易资源可以加入正在进行的交易。如果参与此事务的资源不止一个,则其中至少一个必须是所谓的XA资源。
Aresource local transaction
是使用特定的单一资源使用其自己的特定API进行的交易。这样的事务通常不会传播到调用堆栈中的其他方法,因此您需要传递一些显式的上下文对象。在大多数资源本地事务中,不可能有多个资源参与同一事务。
例如,您将在Java SE中的低级JDBC代码中使用资源本地事务。这里的上下文对象由的实例表示java.sql.Connection
。资源本地事务的其他示例是,开发人员在2002年左右创建企业应用程序。由于在那个时代前后,事务管理器(由JTA使用)是昂贵的,封闭源代码的,并且安装起来很复杂,因此人们选择了更便宜,更容易获得资源本地变量。
您基本上会在其他所有场景中使用JTA事务。非常简单,小型,免费和开源的服务器,例如TomEE(25MB)或GlassFish(35MB),都具有开箱即用的JTA支持。没有任何设置,它们可以正常工作。
最后,EJB和Spring之类的技术通过提供,甚至使JTA更加易于使用declarative transactions
。在大多数情况下,建议使用它们,因为它们更容易,更清洁且更不易出错。EJB和Spring都可以在幕后使用JTA。
对于Java SE应用程序,事务类型应该设置为“ RESOURCE_LOCAL”,对于Java EE应用程序,事务类型应该设置为“ JTA”。“ RESOURCE_LOCAL”在Tomcat上部署的某些Web应用程序上可能工作正常,但是在glassfish环境下运行应用程序时可能会导致问题。
如果您正在处理分布式事务,则必须使用“ JTA”作为事务管理器。