编程式事务

编程式事务

PlatformTransactionManager

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically

def.setName("SomeTxName");
def.setPropagationBehavior(PROPAGATION_REQUIRED);

TransactionStatus status = txManager.getTransaction(def);
try {
    // execute your business logic here
}
catch (MyException ex) {
    txManager.rollback(status);
    throw ex;
}
txManager.commit(status);

TransactionTemplate

如果使用 TransactionTemplate 的话,那么整个应用的代码必须包裹在一个事务的上下文中,如下所示。一般来说用匿名内部类来实现一个TransactionCallback中的execute(..)方法。

public class SimpleService implements Service {
  // single TransactionTemplate shared amongst all methods in this instance
  private final TransactionTemplate transactionTemplate;

  // use constructor-injection to supply the PlatformTransactionManager
  public SimpleService(PlatformTransactionManager transactionManager) {
    Assert.notNull(
      transactionManager,
      "The 'transactionManager' argument must not be null."
    );
    this.transactionTemplate = new TransactionTemplate(transactionManager);
  }

  public Object someServiceMethod() {
    return transactionTemplate.execute(
      new TransactionCallback() {

        // the code in this method executes in a transactional context
        public Object doInTransaction(TransactionStatus status) {
          updateOperation1();
          return resultOfUpdateOperation2();
        }
      }
    );
  }
}

如果你不希望有返回值,可以用如下:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(TransactionStatus status) {
        updateOperation1();
        updateOperation2();
    }
});

也可以手动地控制回滚:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(TransactionStatus status) {
        try {
            updateOperation1();
            updateOperation2();
        } catch (SomeBusinessExeption ex) {
            status.setRollbackOnly();
        }
    }
});

Settings

public class SimpleService implements Service {
  private final TransactionTemplate transactionTemplate;

  public SimpleService(PlatformTransactionManager transactionManager) {
    Assert.notNull(
      transactionManager,
      "The 'transactionManager' argument must not be null."
    );
    this.transactionTemplate = new TransactionTemplate(transactionManager);

    // the transaction settings can be set here explicitly if so desired
    this.transactionTemplate.setIsolationLevel(
        ISOLATION_READ_UNCOMMITTED
      );
    this.transactionTemplate.setTimeout(30); // 30 seconds
  // and so forth...
  }
}

或者直接配置在 XML 中:

<bean id="sharedTransactionTemplate"
        class="org.springframework.transaction.support.TransactionTemplate">
    <property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
    <property name="timeout" value="30"/>
</bean>"
上一页
下一页