使用Spring声明式事务方式控制事务简单方便(详解参考:链接: Spring事务@Transactional的说明和使用举例.),但是有些场景还需要结合编程式事务方式使用。
如以下场景:添加@Transactional注解控制的方法有返回值,若此方法运行期间出现异常既需要回滚当前方法的事务,也要正常return返回值给调用此方法的上级使用。这时就需要手动回滚事务了。
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@Transactional(rollbackFor = Exception.class)
@Override
public List<String> testMethod() {
List<String> res = null;
try {
// do something...
res.add("message");
if (res.size() < 0) {
// 手动抛异常测试
throw new RuntimeException("occur error!");
}
} catch (Exception e) {
System.out.println(e.getMessage());
// 手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return res;
}
return res;
}
以上这段代码中,下面这句代码很关键:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 手动回滚事务
在可能会出现异常的地方手动抛异常,然后在catch中捕获异常,手动回滚异常并return方法返回值,即可。