usstlidawei 2009-08-12
详见: http://www.ibm.com/developerworks/cn/java/j-ts2.html
一. 事务模型:
1. Local Transaction 模型
JDBC 本地事务,
dbConnection.setAutoCommit(true);
在本地事务模型中,事务由底层数据库(DBMS)或消息提供者(Message Provider)来管理维护,从开发者的角度来看,只需要管理使用连接(connections)而不需要管理事务。本地事务模型在小型工程的简单更新操作中能够很好地工作,但是在更加复杂的应用场景下,一个问题是在一个 XA 全局事务中难以协调各资源的工作。 一般情况下,EJB 工程不使用这样的事务模型.
2. Programmatic Transaction 模型
EJB中Bean管理事务
在编程式事务模型中,开发者不再面向连接而是面向事务进行开发。在 EJB 工程中这类事务模型体现为 Bean 管理的事务(Bean-Managed Transactions--BMT). 一般通过sessionContext或者JNDI中获取UserTransaction。编程式事务模型存在一个重大的架构上的限制:我们不能在两个都使用编程式事务模式的 Bean 之间传递事务上下文(transaction context)。不过,我们可以将一个使用编程式事务模型的 EJB 或客户端的事务上下文传递给一个使用声明式事务模型的 EJB。因此在一般情况下,我们仅在调用 EJB 的客户端中使用编程式事务模型。
Spring中获取平台事务管理程序,commit() or rollback()
3. Declarative Transaction 模型
在声明式事务模型中,由容器来管理维护事务,这意味着开发者不需要通过写 Java 代码来开始或提交一个事务,取而代之的是使用一定的“声明”告诉容器如何来管理事务。我们可以通过 ejb-jar.xml 配置文件来实现对容器的声明,同样也可以使用注释或部署描述符来声明使用事务。在 EJB 中,声明式的事务模型体现为容器管理的事务(Container-Managed Transactions--CMT)。
Container Managed Transactions (CMT)
Spring 使用 @Transactional
注释,而 EJB 3.0 使用 @TransactionAttribute
注释。在使用 Declarative Transaction 模型时,容器将不会针对检测到的异常自动回滚事务。开发人员必须指定出现异常时在何处以及何时回滚事务。在 Spring Framework 中,您通过使用 @Transactional
注释上的 rollbackFor
属性来指定它。在 EJB 中,您通过调用 SessionContext
上的 setRollbackOnly()
方法来指定它。
在大部分情况下,我们在实现 EJB 的时候使用声明式的事务模型(即 CMT),而在调用这些 EJB 的客户端代码中使用编程式的事务模型。
二. 事务策略
Client Orchestration 事务策略 API Layer 事务策略 High Concurrency 事务策略 High-Speed Processing 事务策略