jdbc如何處理事務


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 }
復制代碼
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM