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 }
复制代码
 
 
 

posted on 2019-08-23 17:41  小甜瓜安东泥  阅读(1077)  评论(0编辑  收藏  举报