我试图了解交易,更具体地说,我正在使用Spring框架进行交易。仔细阅读我所拥有的材料(包括互联网和书籍),我会看到以下术语:
容器管理的交易(CMT)。
Bean管理的事务(BMT)。
Java事务API(JTA)。
同样,对于大型企业级应用程序,我也遇到过诸如“本地”和“全局”事务之类的术语。
我所了解的是,全局事务是针对以下情况的:我们正在管理两种或多种不同的资源(例如一个Oracle DB,其他MySQL等),并且如果两者都成功/失败,则会向它们提交/回退。当我们只有一种资源要管理时(例如,只有一个与MySQL的数据库连接),就进行本地事务处理。
我有以下疑问:
在编写简单的JDBC独立程序时,我们可以编写代码以进行提交/回滚。我相信这是本地交易的例子,对吗?并由“ JDBC”库本身或驱动程序来处理此事务吗?
什么是CMT?我了解的是Container负责事务管理(例如Jboss AS)。如果这是正确的,它在内部如何管理? CMT是本地的还是全球的?他们是否在内部使用JDBC API来管理事务?
什么是BMT?这我听不懂。我们可以将应用程序部署在App服务器中(并且我相信在那种情况下,事务将由Container管理),或者我可以编写一个独立的应用程序,在其中我可以自己使用事务管理代码(尝试.. catch块等)。那么,BMT属于哪一类?
在阅读Spring框架时,我读到Spring框架有自己的管理事务的方式。最后,我读到Spring Framework使用JTA来管理事务?我对此感到困惑。如果JTA是API,我们是否有多个供应商实施JTA(就像JPA一样,我们可以有多个供应商提供实施,例如Hibernate)。
JTA适用于本地或全球交易吗?当我编写一个简单的JDBC程序来管理事务时,它是否使用符合JTA的API?还是JTA与简单JDBC程序使用的事务管理完全不同?
与CMT一样,CMT是否遵循JTA制定的规则(主要是API)?
如果您回答得对,那就太好了,我确实在网上搜索,但我的疑问仍未得到解答。
最佳答案
关于本地/全局事务:通过全局,我想您正在谈论XA事务(两个阶段的提交:http://en.wikipedia.org/wiki/X/Open_XA)。当您处理多个数据库或事务资源时,这只是强制性的。
是的,这是一个“本地事务”,这意味着只有一个数据库是
交易的一部分。事务由数据库管理
并在这种情况下由JDBC控制。
CMT:容器托管:容器将检测开始并
事务结束时,将执行提交/回滚
取决于方法的返回状态(成功返回:提交,
例外:回滚)。 CMT依靠JTA在其上管理交易
资源。然后取决于适当的资源适配器(RA)进行讨论
到jdbc或与您的EIS(数据)有关的任何其他驱动程序。看着
http://docs.oracle.com/javaee/5/tutorial/doc/bncjx.html
BMT:这意味着要由Bean来控制交易
边界。使用这种交易非常罕见
这些天的管理。使用BMT,您可以控制UserTransaction
对象,直接控制交易边界是错误的
与JDBC。还要记住,即使您在BMT中,
像JPA(不是JTA)之类的框架将使当前的交易无效
任何错误,即使您没有明确要求回滚。它
表示使用BMT非常困难/危险/无用。
JTA(我希望您不要误拼JPA)是另一个层次:JTA
资源适配器必须实现的API才能成为容器的一部分
交易。除了UserTransaction类(您将在
BMT控制交易边界)与您无关
JTA。没有JTA的多个实现,但是有JTS(Java事务服务)的多个实现,每个应用程序服务器供应商都实现自己的JTS。
JTA是框架设计师的API,JTA向
资源适配器RA,并且RA将使用JDBC或任何其他API来
处理它的EIS(企业信息存储,我们称之为
您的数据库)。 JTA适用于XA和非XA事务(如果您的RA支持XA事务)。
CMT使用JTA,但JTA同样是
应用程序服务器的组件。应用程序设计师应
不在乎JTA。