Java EE 事务管理

Open Group组织定义的分布式事务处理模型包括:应用程序(AP)、事务管理器(TM)、资源管理器(RM)、通信资源管理器(CRM)。

常见的事务管理器就是事务中间件(通常由应用服务器来实现)、常见的资源管理器就是数据库、常见的通信管理器就是消息中间件。

XA规范:Open Group组织为分布式事务指定的事务中间件与数据库之间的接口规范。

XA规范的理论基础是两阶段提交协议。

JTA 分布式事务管理

调用javax.transaction.UserTransacton接口的begin、commit、rollback等方法来控制事务。

除了使用应用服务器的事务中间件,也可以使用JTA开源框架:JOTM,Atomikos。

隔离级别

JDBC规范定义的5种隔离级别:

TRANSACTION_NONE

TRANSACTION_READ_UNCOMMITTED

TRANSACTION_READ_COMMITED

TRANSACTION_REPEATABLE_READ

TRANSACTION_SERIALIZABLE

通过调用Connection接口的setTransaction()方法可以设置事务的隔离级别,隔离级别是对所有的JDBC访问起作用。

事务传播属性

事务属性主要用来控制事务的作用域。

有6种事务属性:

Required

RequiresNew

Mandatory

NotSupported

Supports

Never

为EJB设置事务属性,可以通过javax.ejb.TransactionAttribute Annotation 来标注EJB或方法,并将它的值设置为javax.ejb.TransactionAttributeType枚举值之一。

EJB的事务管理

EJB有两种事务管理,都建立在JTA之上,一种是通过容器来管理事务(CMT),以声明的方式管理事务;另一种是在EJB内部使用事务管理代码自己管理事务,也叫Bean事务管理(BMT)。

CMT:

EJB默认使用容器管理事务的策略。容器总是在业务方法的开始、结束处标记事务边界。也就是说,容器在调用方法之前开始JTA事务,然后根据方法的调用情况来决定提交或回滚事务。

当使用容器来管理事务时,业务方法不应该调用任何可能与容器所设置事务边界冲突的方法。如下都是被禁止的:

禁止调用Connection接口的commit、SetAutoCommit和rollback方法。

禁止调用EJBContext的getUserTransaction方法。

禁止调用UserTransaction的任何方法。

BMT:

Bean事务管理比起CMT要更加灵活,开发者可以通过代码灵活控制事务细节。

Bean管理事务可以由开发者决定到底是使用JTA事务、还是使用JDBC事务。

对于Bean事务管理来说,程序代码中不要调用EJBContext接口中的getRollbackOnly和setRollbackOnly方法。允许调用UserTransaction的方法手动控制事务。

事务超时设置

对于容器托管事务,如果事务一直不结束(不提交,不回滚)那就会导致相关数据一直处于锁定状态,从而引起性能下降。为了改变这种状态,可以考虑为数据源设置超时时长,如果某个事务超过该时长没有结束,应用服务器将会自动回滚该事务。

posted @ 2015-06-20 11:33  大步  阅读(513)  评论(0编辑  收藏  举报