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