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 }