JDBC事务
1 package com.neu.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.SQLException; 7 8 /** 9 * 关于JDBC的事务 1、JDBC 默认情况下,事务是自动提交的:即在 JDBC 中执行一条 DML语句就执行一条 ,这种显然是不符合现实的业务逻辑的 10 * 2、什么是自动提交?怎么理解自动提交? 11 * 在JDBC中只有执行一次DML语句,就提交一次。 12 * 3、怎么避免自动提交?怎么改成手动提交? 13 * 显然在现实的业务逻辑下,一个完整的事务时需要多条DML共同完成的 14 * 需要将自动提交机制关闭,修改成手动提交 当一个事务真正结束的时候提交 15 * 4、什么时候回滚? 16 * 若执行过程中任何一步出现异常,应当回滚 17 * 5、JDBC事务代码总结: 18 * conn.setAutoCommit(false); 19 * …… 20 * …… 21 * conn.commit(); 22 * …… 23 * conn.rollback(); 24 * 25 * @author imsha 26 * 27 */ 28 public class JDBCTest09 { 29 public static void main(String[] args) { 30 Connection conn = null; 31 PreparedStatement ps = null; 32 33 try { 34 // 注册驱动 35 Class.forName("com.mysql.jdbc.Driver"); 36 // 获取连接对象 37 conn = DriverManager.getConnection("jdbc:mysql://localhost:3366/bjpowernode", "root", "123"); 38 39 // 开启事务 40 // 关闭自动提交机制 41 conn.setAutoCommit(false);// 不再支持自动提交 42 43 // 获取数据库操作对象 44 String sql = "insert into dept(deptno,dname,loc) values (?,?,?)"; 45 ps = conn.prepareStatement(sql); 46 ps.setInt(1, 60); 47 ps.setString(2, "市场部"); 48 ps.setString(3, "北京"); 49 // 执行SQL语句 50 int count = ps.executeUpdate(sql); 51 52 // 重新给?赋值 53 ps.setInt(1, 60); 54 ps.setString(2, "市场部"); 55 ps.setString(3, "北京"); 56 count += ps.executeUpdate(sql); 57 System.out.println(count); 58 59 // 事务执行到此处,表示执行完成,应当手动提交 60 conn.commit(); 61 62 } catch (Exception e) { 63 //若在以上事务执行过程中发生异常,则回滚 64 if (conn != null) { 65 try { 66 conn.rollback(); 67 } catch (SQLException e1) { 68 e1.printStackTrace(); 69 } 70 } 71 e.printStackTrace(); 72 } finally { 73 // 关闭资源 74 if (conn != null) { 75 try { 76 conn.close(); 77 } catch (SQLException e) { 78 e.printStackTrace(); 79 } 80 } 81 if (ps != null) { 82 try { 83 ps.close(); 84 } catch (SQLException e) { 85 e.printStackTrace(); 86 } 87 } 88 } 89 } 90 }