Spring 事务回滚机制

jopen 8年前

异常回滚示例

  1. 捕获异常,不抛出,事物不能回滚!!!

if(userSave){                try {                   userDao.save(user);                    userCapabilityQuotaDao.save(capabilityQuota);                } catch (Exception e) {                    logger.info("能力开通接口,开户异常,异常信息:"+e);                }            }

  2.捕获异常,抛出运行时异常,回滚。当一个方法出错,另一个方法必然回滚

if(userSave){                try {                    userDao.save(user);                    userCapabilityQuotaDao.save(capabilityQuota);                  } catch (Exception e) {                   logger.info("能力开通接口,开户异常,异常信息:"+e);                    throw new RuntimeException();                }            }

 3.捕获异常,手动回滚

if(userSave){                try {                    userDao.save(user);                    userCapabilityQuotaDao.save(capabilityQuota);                } catch (Exception e) {                    logger.info("能力开通接口,开户异常,异常信息:"+e);                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();               }            }

 异常事务回滚解决方案: 

 方案1.

       例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理

  方案2.

       在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常



来自: http://my.oschina.net/manmao/blog/593886