三層架構中的業務邏輯層是處理業務邏輯的部分,很多時候需要調用多步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不久,小結一下。
