1. 程式人生 > >使用DBUtils完成事務處理功能

使用DBUtils完成事務處理功能

注意:

    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();
        }
    }