三層架構中的業務邏輯層是處理業務邏輯的部分,很多時候需要調用多步Dao層的增刪改操作,這就涉及到使用事務保證數據的一致性。
Connection接口自帶的事務機制需要保證多步SQL操作使用相同的連接對象,這樣才能保證事務的執行環境。
事務的邊界一般是在業務邏輯層的(即事務的開啟、提交、回滾都是在業務邏輯層),因為業務邏輯層會涉及多步操作,所以Connection對象要在業務邏輯層創建,然后將Connection對象傳給Dao層的方法即可。
為了確保事務的正確性,異常要統一在業務邏輯層處理
下面展示使用Connection啟動事務的具體代碼
/** * 開始事務 * @param cnn */ public static void beginTransaction(Connection cnn){ if(cnn!=null){ try { if(cnn.getAutoCommit()){ cnn.setAutoCommit(false); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 提交事務 * @param cnn */ public static void commitTransaction(Connection cnn){ if(cnn!=null){ try { if(!cnn.getAutoCommit()){ cnn.commit(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 回滾事務 * @param cnn */ public static void rollBackTransaction(Connection cnn){ if(cnn!=null){ try { if(!cnn.getAutoCommit()){ cnn.rollback(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
這三個方法一般會放在一個公共類DbUtil中,方法都是靜態的,可通過類名.方法直接調用。只需將連接作為參數傳給這些方法即可,以下為使用上述方法創建事務環境的代碼框架。
public void funcExample(){ Connection cnn=DbUtil.getConnection(); try{ //開啟事務 DbUtil.beginTransaction(cnn); //調用Dao層多個增刪改方法 //.......... //提交事務 DbUtil.commitTransaction(cnn); }catch(Exception e){ e.printStackTrace(); //回滾事務 DbUtil.rollBackTransaction(cnn); }finally{ //還原連接狀態 DbUtil.resetConnection(cnn); DbUtil.close(pstm); DbUtil.close(cnn); } }
剛接觸JDBC不久,小結一下。