checked异常和unchecked异常
Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。
checked异常:
表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。
必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。
继承自java.lang.Exception(java.lang.RuntimeException除外)。
unchecked异常:
表示错误,程序的逻辑错误。是RuntimeException的子类,比如IllegalArgumentException, NullPointerException和IllegalStateException。
不需要在代码中显式地捕获unchecked异常做处理。
继承自java.lang.RuntimeException(而java.lang.RuntimeException继承自java.lang.Exception)。
看下面的异常结构图或许层次感更加深些:
事务回滚:
不会回滚try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
throw new Exception();
}try {
userDao.save(user);
} catch (Exception e) {
}
可以回滚try {
userDao.save(user);
} catch (Exception e) {
throw new RuntimeException();
}
try {
userDao.save(user);
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}//创建一个回滚点
Object o1 = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
try {
userDao.save(user);
} catch (Exception e) {
//回滚到指定点
//提交保存点之前的事务,保存点之后的事务不去提交
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(o1);
}
//释放保存点
TransactionAspectSupport.currentTransactionStatus().releaseSavepoint(o1);