EMP提供了很多的扩展途径,而在这些扩展中经常会存在着数据库的操作,这就要求开发人员对EMP的事务处理有一定的了解。
1、在业务操作单元(EMPAction)中通过配置方式处理事务
EMPAction在EMP的架构体系中是对事务进行控制的最小单元,对于EMPAction的事务处理可通过实现相应接口并采用配置化的方式实现。当扩展的业务操作单元(EMPAction)需要对事务进行控制时,可以将相应的扩展类继承JDBCAction。然后在业务逻辑中设置该业务操作单元的trxType属性(TRX_REQUIRED表示全局事务,TRX_REQUIRE_NEW表示独有事务)。
如果没有继承JDBCAction,那么也可以在扩展的业务操作单元(EMPAction)增加transactionType的setter和getter方法:
public void setTransactionType(String value) {
if ("TRX_REQUIRED".equals(value))
this.trxType = EMPTransactionDef.TRX_REQUIRED;
else if ("TRX_REQUIRE_NEW".equals(value))
this.trxType = EMPTransactionDef.TRX_REQUIRE_NEW;
}
public EMPTransactionDef getTransactionDef() {
return new EMPTransactionDef(trxType);
}
2、在业务操作单元(EMPAction)中手工操作事务
EMP除了支持通过手工的方式进行事务的配置以外,开发人员还可以在代码中直接调用相应的接口进行事务的处理
EMPTransactionManager transactionManager = (EMPTransactionManager) context.getService(EMPConstance.TRX_SVC_NAME); //获得事务管理器
EMPTransaction transaction = transactionManager.getTransaction(new EMPTransactionDef(EMPTransactionDef.TRX_REQUIRE_NEW));//启动新的事务,如果要获得全局的事务则使用EMPTransactionDef.TRX_REQUIRE
try{
//在取得事务之后,取数据库连接
Connection connection = ConnectionManager.getConnection(dataSource);
//数据库操作
//如果操作结束需要提交事务,则调用下面代码
transactionManager.commit(transaction);
}catch(异常){
//如果发生异常后,立刻回滚,则调用下面代码
transactionManager.rollback();
//如果是全局事务,且希望操作全部结束后再回滚,则调用下面的代码
transactionManager.setRollBackOnly();
}
3、其它扩展的接口中操作事务
与EMPAction一样,开发人员可以在代码中直接调用相应的接口进行事务的处理(其中EMPService的层次比EMPAction低,是不能直接针对事务进行处理的),调用的方式与上述一致。手工的操作事务能够带来非常灵活的功能实现,但是推荐的方式还是通过调用业务逻辑构件的方式来实现