JDBC事務處理

package cn.code.demo;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class AccountDao {
    /*
     * 修改指定用戶餘額
     * */
    //爲了不使用不一樣的Connection,因此採用傳遞連接的方式保證事物中使用同一個連接;
    public void updateBalance(Connection con,String username,double balance){
        try{
            String sql = "update account set balance=balance+? where name=?";
            PreparedStatement ps=con.prepareStatement(sql);
            ps.setDouble(1, balance);
            ps.setString(2, username);
            ps.executeUpdate();
        }catch(Exception e){throw new RuntimeException(e);}
    }
}

//根據上面提供的業務情景,完成事務處理java

package cn.code.demo;
/*
 * 一、事物四大特性:
 * 原子性(不可再分割,不可能成功一半)
 * 隔離性(併發進行提交多個事物進行隔離)
 * 一致性(操做先後數據保持一致)
 * 持久性(一旦事物提交成功,事物中全部的數據操做都必須被持久化)
 * mysql中開啓事物:
 * 開啓事物:start tansaction;
 * 結束事物:commit;或rollback;
 * 事物併發問題:
 * 髒讀:讀取到一個事物未提交的數據。
 * 不可重複讀:對同一條記錄兩次讀取不一致,由於另外一事物對該記錄作了修改;
 * 幻讀(虛讀):對同一張表的兩次查詢不一致,覺得另外一事物插入了一條記錄;
 * 四種隔離級別:
 * 串行化:serializable
 * 可重複讀:repeatable(mysql) 不能處理幻讀,防止髒讀和不可重複讀
 * 讀已提交數據:read committed(oracle) 防止髒讀,沒有處理可重複度和幻讀
 * 讀未提交數據:read uncommitted 性能最好,可是可能出現事務併發問題,沒有處理髒讀、幻讀、可重複讀
 * 設置事物隔離級別con.setTrasactionisolation();
 * */
import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import cn.code.DBUtils1.DBUtils1;

/*
 * 
 * */
public class Demo1 {
    public void zhuanzhang(String from,String to,double money){
        //對事物操做必須使用Connection對象,那麼必須保證同一個事物使用同一個Connection
        //
        Connection con = null;
        try{
            con =DBUtils1.getConnection();//獲取了一個新鏈接
            con.setAutoCommit(false);
            AccountDao dao = new AccountDao();
            dao.updateBalance(con,from, -money);//減去金額,傳遞原有連接
            dao.updateBalance(con,to, money);//加上金額,傳遞原有連接
            con.commit();
        }catch(Exception e){
            try {
                con.rollback();
            } catch (SQLException e1) {
            }
        }
    }
    @Test
    public void test(){
        zhuanzhang("zs","ls",100);
    }
}
相關文章
相關標籤/搜索