Connection提供了事務處理的方法,通過調用setAutoCommit(false)可以設置手動提交事務;當事務完成后用commit()顯式提交事務;如果在事務處理過程中發生異常則通過rollback()進行事務回滾。除此之外,從JDBC 3.0中還引入了Savepoint(保存點)的概念,允許通過代碼設置保存點並讓事務回滾到指定的保存點。
JDBC事務
在JDBC中處理事務,都是通過Connection完成的。
同一事務中所有的操作,都在使用同一個Connection對象。
①JDBC中的事務
Connection的三個方法與事務有關:
- setAutoCommit(boolean):設置是否為自動提交事務,如果true(默認值為true)表示自動提交,也就是每條執行的SQL語句都是一個單獨的事務,如果設置為false,那么相當於開啟了事務了;con.setAutoCommit(false) 表示開啟事務。
- commit():提交結束事務。
- rollback():回滾結束事務。
JDBC處理事務的代碼格式:
try{ con.setAutoCommit(false);//開啟事務 ...... con.commit();//try的最后提交事務 } catch() { con.rollback();//回滾事務 }
示例:
1 public class AccountDao { 2 /* 3 * 修改指定用戶的余額 4 * */ 5 public void updateBalance(Connection con, String name,double balance) { 6 try { 7 String sql = "UPDATE account SET balance=balance+? WHERE name=?"; 8 PreparedStatement pstmt = con.prepareStatement(sql); 9 pstmt.setDouble(1,balance); 10 pstmt.setString(2,name); 11 pstmt.executeUpdate(); 12 }catch (Exception e) { 13 throw new RuntimeException(e); 14 } 15 } 16 }
1 import cn.itcast.jdbc.JdbcUtils; 2 import org.junit.Test; 3 import java.sql.Connection; 4 import java.sql.SQLException; 5 6 public class Demo1 { 7 /* 8 * 演示轉賬方法 9 * 所有對Connect的操作都在Service層進行的處理 10 * 把所有connection的操作隱藏起來,這需要使用自定義的小工具(day19_1) 11 * */ 12 public void transferAccounts(String from,String to,double money) { 13 //對事務的操作 14 Connection con = null; 15 try{ 16 con = JdbcUtils.getConnection(); 17 con.setAutoCommit(false); 18 AccountDao dao = new AccountDao(); 19 dao.updateBalance(con,from,-money);//給from減去相應金額 20 if (true){ 21 throw new RuntimeException("不好意思,轉賬失敗"); 22 } 23 dao.updateBalance(con,to,+money);//給to加上相應金額 24 //提交事務 25 con.commit(); 26 27 } catch (Exception e) { 28 try { 29 con.rollback(); 30 } catch (SQLException e1) { 31 e.printStackTrace(); 32 } 33 throw new RuntimeException(e); 34 } 35 } 36 @Test 37 public void fun1() { 38 transferAccounts("zs","ls",100); 39 } 40 }