事务模型和事务策略

详见: 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 事务策略

相关推荐