1 主要處理思路
1.1 思路1
事物回滾,一般拋異常,可以自己手寫一個異常,根據異常判斷。事物還是按照 spring 的之前的邏輯。只是,手工拋特定的異常。這樣你就可以捕獲這個異常給前臺使用者。
1.2 思路2
方法捕獲異常丟擲即可,記得方法定義必須丟擲異常,否則框架捕獲不到,宣告式事物不起作用。
1.3 總結
我認為上述思路在實現上是統一的。下面給出一個用虛擬碼描述的例子。
MyException:
public class MyException extends RuntimeException {
public MyException(){
}
}
Action中:
@Autowired
public class XAction {
@Autowired
private XServicexService xService;
public String AddXmethod(){
try {
xService.addX (x); //將x存入資料庫
} catch (MyException e) {
System.out.println("service層出異常了....");
//其它處理,例:加上需要在前端顯示的提示資訊。
}
}
}
xService中:
@Service
@Transactional(propagation=org.springframework.transaction.annotation.Propagation.REQUIRED)
public class XService{
@Autowired
private XDao xDao;
public void addX (X x) throws MyException {
xDao.addX(x);
//人為的建立出一個異常,測試回滾在action中可以被判斷。
try {
int a =10/0;
} catch (Exceptione) {
//手工丟擲,作用有兩個,
//1、使用spring事務增強,對事務回滾。
//2、action中可以捕獲該異常,並處理,例:在前端顯示提示資訊。
throw new MyException();
}
}
}
例子結果說明:
1、事務增強可以通過SpringAOP進行事務增強。
2、事務發生回滾時,Action可以“判斷”事務發生了回滾,並處理。
2 參考文獻
http://www.jb51.net/article/3… (Spring事務管理只對出現執行期異常進行回滾改變預設方式)
http://www.cnblogs.com/0201zc…(spring 事務回滾)
http://blog.csdn.net/gaowenmi… (spring AOP的異常攔截)
http://www.cnblogs.com/zhuawa… (關於Spring事務回滾的問題)
https://www.oschina.net/quest… (spring的事務insert操作怎麼判斷是否執行成功了還是回滾了)
濟南java技術交流群群主隱士的思路與百度使用者mahl8007的思路。