@Autowired
private TransactionTemplate transactionTemplate;
Boolean isSuccess = (new TransactionCallback<Boolean>() {
public Boolean doInTransaction(TransactionStatus status) {
Boolean result = true;
try {
// TODO
} catch (Exception e) {
();
result = false;
// TODO
}
return result;
}
});
()
方法有一个 TransactionCallback
类型的参数,该接口中定义了一个 doInTransaction()
方法,通常我们以匿名内部类的方式实现 TransactionCallback
接口,并在其 doInTransaction()
方法中书写业务逻辑代码。这里可以使用默认的事务提交和回滚规则,这样在业务代码中就不需要显式调用任何事务管理的 API。doInTransaction()
方法有一个TransactionStatus
类型的参数,我们可以在方法的任何位置调用该参数的setRollbackOnly()
方法将事务标识为回滚的,以执行事务回滚。
根据默认规则,如果在执行回调方法的过程中抛出了未检查异常,或者显式调用了()
方法,则回滚事务;如果事务执行完成或者抛出了checked类型的异常,则提交事务。
TransactionCallback
接口有一个子接口 TransactionCallbackWithoutResult
,该接口中定义了一个 doInTransactionWithoutResult()
方法,TransactionCallbackWithoutResult
接口主要用于事务过程中不需要返回值的情况。当然,对于不需要返回值的情况,我们仍然可以使用 TransactionCallback
接口,并在方法中返回任意值即可。
注:
TransactionTemplate
不可以在@Transactional
注解的作用范围内使用,否则会导致异常:Transaction rolled back because it has been marked as rollback-only。