堅持每天寫博文,積累下開發中的點點滴滴
Transaction
- 將應用代碼從底層的事務實現中抽離出來,底層事務可以是JDBC事務,JTA用戶事務(在兩個系統或兩個數據庫同時使用事務)甚至是一個公共對象請求代理結構,允許應用通過一組一致的API控制事務邊界。(可以存在多個事務)
- 使用hibernate進行操作時,(增刪改)必須顯示的調用Transaction(默認autoCommit=false)
- 當我們需要兩個表中同時使用事務的時候標準寫法是
public static void main(String[] args) {
Session session = null;
Transaction tran = null;
try {
SessionText sessionText = new SessionText();
sessionText.setSes_name("sessionText");
sessionText.setSes_passWord("sessionPass");
session = HibernateUtils.getSession();
tran = session.beginTransaction();
session.save(sessionText);
/*session.save(sessionText2);(第二張表)*/
tran.commit();
} catch (Exception e) {
e.printStackTrace();//是否活動中
if(tran == null && tran.isActive()) {
tran.rollback();
}
}finally {
if(session == null && session.isOpen()) {
session.close();
}
}
}
以上代碼實現同時存入兩個對象,當只有其中一個對象存入另外的出錯是進行回滾。這種寫法是當同時操作兩個表的時候使用,只操作一個表的時候直接使用session.beginTransaction();就可以。
總結
- org.hibernate.Transaction 可以對同一個數據庫裏面的N個表處理事務(要不都成功,要麼都失敗)
- javax.transaction.Transaction 對不同數據庫裏的N個表處理事務(要麼都成功,要麼都失敗),一般被稱爲JTA事務。實現原理:有一個內部事務List;List.add(dml是否成功的標誌:boolean),最後判斷list裏面的boolean是否全部爲true,都成功。