事务概念:
小明有100块钱去买书,买书的过程是先扣钱还是背包表加上一本书? 方案一:先扣钱再加书 方案二:先加书在扣钱 无论方案一还是方案二都是两步操作必有一先一后。如果我们的Java代码执行第一步的时候没问题,第二步报错导致方法没有执行。 方案一结果钱没了,书也没了。 方案二结果书有了,钱没扣。 Spring框架帮我们整合了数据库的事务。通常我们直接使用@Transactional注解。但是如果业务复杂即便我们加了@Transactional注解通常也会失效。所以下面的伪代码提供了事务回滚的安全方案。
/**
1.添加事务注解 指定了一旦发生Exception.class的异常就会触发回滚
如果异常被catch到,如果不再抛出异常,则回滚无效。
往往在catch代码块再次抛出异常(一般是业务定义的异常,
如果嫌麻烦可直接throw new RuntimeException("抛出xxx异常"); ),
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void abc() {
try {
// 2.执行业务 这里无论发生多少异常一旦被catch住,Spring事务将不会执行回滚,所以一般在catch代码块里再次抛异常。
} catch (Exception e) {
// 3.记录日志,手动再抛异常
System.out.println("记录下异常信息");
throw new RuntimeException("抛出xxx异常");
}
}
// 在Spring事务操作过程中,后置通知执行前强制执行回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
/**
1.添加事务注解 指定了一旦发生Exception.class的异常就会触发回滚
如果异常被catch到,如果不再抛出异常,则回滚无效。
往往在catch代码块再次抛出异常(一般是业务定义的异常,
如果嫌麻烦可直接throw new RuntimeException("抛出xxx异常"); ),
*/
@Transactional(rollbackFor = ClassNotFoundException.class)
@Override
public void abc() {
try {
// 2.执行业务 这里无论发生多少异常一旦被catch住,Spring事务将不会执行回滚,所以一般在catch代码块里再次抛异常。
} catch (Exception e) {
// 在Spring事务操作过程中,后置通知执行前强制执行回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// 3.记录日志,手动再抛异常
System.out.println("记录下异常信息");
// throw new NullPointerException("抛出xxx异常");
}
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。