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 }

