使用DBUtils完成事務處理功能
阿新 • • 發佈:2019-01-06
注意:
DBUtils進行事務處理的原理,是在Service層獲得連線,以保證事務處理過程中的Connection物件為同一個Connection。
Service層程式碼:
/**
* 事務管理方式:向下傳遞Connection。有侵入性。使用DBUtils
* 業務層事務管理轉賬的方法
* @param from
* @param to
* @param money
*/
public void transfer(String from, String to, double money) {
//呼叫dao層
AccountDao accountDao = new AccountDao();
//方法一:因為必須保證連線為同一個連線,所以在業務層獲得連線,再將連線傳遞到持久層,程式碼具有侵入性。
//DBUtils使用的方法
Connection conn = null;
try {
//獲得連線
conn = C3P0Utils.getConnection();
//設定事務不自動提交
conn.setAutoCommit(false);
//呼叫持久層
accountDao.outMoney(conn,from,money);
//如果有異常
//int a = 1 / 0 ;
accountDao.inMoney(conn,to,money);
//提交事務,並安靜的關閉連線
DbUtils.commitAndCloseQuietly(conn);
} catch (SQLException e) {
//有異常出現時,回滾事務,並安靜的關閉連線
DbUtils.rollbackAndCloseQuietly(conn);
e.printStackTrace();
}
}
Dao層 程式碼:
public void outMoney(Connection conn, String from, double money) {
QueryRunner qr = new QueryRunner();
try {
String sql = "update account set money = money - ? where username = ?";
qr.update(conn, sql, money,from);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void inMoney(Connection conn, String to, double money) {
QueryRunner qr = new QueryRunner();
try {
String sql = "update account set money = money + ? where username = ?";
qr.update(conn, sql, money,to);
} catch (SQLException e) {
e.printStackTrace();
}
}