Bean管理事务,主要就是通过UserTransaction来控制事务开始、结束。
首先需要获得UserTransaction,有三种方式
1)使用@Resource执行依赖注入
2)通过JNDI查找来获取,代码如下
UserTransaction tx=(UserTransaction)ctx.lookup(“UserTransaction”);
3)使用EJBContext的getUserTransaction方法,代码如下
UserTransaction tx=ctx.getUserTransaction();
其中第一中比较简单,接着在代码使用
tx.begin();tx.commit();tx.rollback();
下面是UserTransaction所包含方法的简单解释
begin:用于开始新的事务,创建一个新的事务,并将他关联到当前执行线程中。
commit:用于提交事务,将会结束当前线程关联的事务
getStatus:用于获取当前线程关联的事务状态
rollback:用于回滚事务,同样结束当前线程关联的事务
setRollbackOnly:只能在CMT事务管理器中使用,用于通知容器回滚当前事务。
setTransactionTimeout(int secondes):用于修改当前线程所关联事务的超时时长
上面的方法中getStatus是EJBContext中getRollbackOnly方法的复杂版,getRollbackOnly只能返回一个boolean值,而getStatus方法则返回代表当前事务状态的值,包括
javax.transaction.Status.STATUS_ACTIVE:当前线程处于活动阶段
javax.transaction.Status.STATUS_COMMITTED:当前线程已经被提交
javax.transaction.Status.STATUS_COMMITTING:当前线程正处于提交过程中
javax.transaction.Status.STATUS_MARKED_ROLLBACK:当前线程已被标记为回滚。可能是由于当前线程调用了UserTransaction的setRollback(true)方法。
javax.transaction.Status.STATUS_NO_TRANSACTION:当前线程没有事务支持
javax.transaction.Status.STATUS_PREPARED:当前事务正准备提交,正在等待从属资源的响应
javax.transaction.Status.STATUS_PREPARING:当前事务处于预备阶段,所有从属资源都已经同意提交
这两个状态值与两段式提交有关,两段式提交协议方式在正式提交事务之前,需要先尝试提交该事务的多个从属源,只有当从属源尝试提交都返回成功时,JTA全局事务才会正式提交。在第一阶段中尝试提交了多个从属资源,当这些从属资源的结果尚未返回时,事务处于STATUS_PREPARING状态;当这些从属资源都返回了提交成功时,这意味着JTA全局事务可以真正提交了,那么事务处于STATUS_PREPARED状态。
javax.transaction.Status.STATUS_ROLLEDBACK:当前事务已经被回滚了<