事務回滾
1.當時需要用到事務回滾,但是看到網上只有問題,沒有真實的到底怎么用法。
2.我看了一下文檔,結合了網上的大神的博客。
第一種方法:
Db.tx(new IAtom(){
@Override
public boolean run() throw SQLException{
//在這里寫要執行的操作,在執行的過程中如果有異常將回滾,如果return false 就也回滾
return true;
}
});
我的代碼:
public static void clearScores() { // TODO Auto-generated method stub Db.tx(new IAtom() { //在執行run的過程中,如果有異常將回滾,或者return false 將回滾 @Override public boolean run() throws SQLException { //獲取所有的到期用戶 List<Associator> assocs = Associator.dao.getAssocsOfScoresExpire(); for( int i = 0 ; i < assocs.size() ; i ++ ){ Associator assoc = assocs.get(i); //在積分明細中寫入記錄存入 Map map = new HashMap(); map.put("ASSOC_ID",assoc.get(Associator.COLLUMNS.ASSOC_ID)); map.put("CREATED_BY","AUTO"); map.put("DEAL_TYPE","扣除"); map.put("ASSOC_SCORE",assoc.get(Associator.COLLUMNS.ASSOC_SCORE)); map.put("DEAL_REASON","積分到期"); AssociatorScore.dao.saveScore(map); //修改對應的積分和會員的最近簽到時間 assoc.set(Associator.COLLUMNS.ASSOC_SCORE, 0); assoc.set(Associator.COLLUMNS.FIRST_SIGN_TIME, Calendar.getInstance().getTime()); assoc.set(Associator.COLLUMNS.MODIFIED_AT, Calendar.getInstance().getTime()); //測試能否回滾 /*if( i == 1) assoc.remove("ID");*/ assoc.update(); } return true; } }); } }
還有一種方式:
聲明事務方式:在方法前聲明@Before(Tx.class)
注:我試了很多次都不管用,最終發現沒有設置攔截器。文檔中寫的比較清楚。
還有我覺得文檔真心的整理的不夠,不過實現基礎的功能還是可以的。