1 package com.ayang.jdbc; 2 3 import java.sql.*; 4 /** 5 * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提交。 6 * 下边例子有三条update语句,假设第一条是updateA账户上的钱完了,自动提交,这时候出错了,B账户上的钱没update,这时候会出现数据不一致的问题。 7 * 解决办法很简单,把它放在一个transtraction里去,要么两条同时完成,要么都不完成。 8 * 任何一条DML语句会自动提交,因为在整个数据库连接里,有一个属性:AutoCommit();默认为值true,会自动提交。要想把某些语句放在一个transaction里, 9 * 把AutoCommit(false);设为false,手动提交:最后执行conn.commit();然后恢复AutoCommit()为true. 10 * 如果catch到任何SQLException,首先进行conn.rollback();然后conn.setAutoCommit(true);确保万无一失。 11 */ 12 13 14 public class TestTransaction { 15 16 public static void main(String[] args) { 17 Connection conn = null; 18 Statement stmt = null; 19 try { 20 Class.forName("oracle.jdbc.driver.OracleDriver"); 21 conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","root"); 22 23 conn.setAutoCommit(false); 24 stmt = conn.createStatement(); 25 stmt.addBatch("insert into dept2 values(60,‘CPU‘,‘XUCHANG‘)"); 26 stmt.addBatch("insert into dept2 values(61,‘CPU‘,‘XUCHANG‘)"); 27 stmt.addBatch("insert into dept2 values(62,‘CPU‘,‘XUCHANG‘)"); 28 stmt.executeBatch(); 29 conn.commit(); 30 conn.setAutoCommit(true); 31 32 33 } catch (ClassNotFoundException e) { 34 e.printStackTrace(); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 38 try { 39 if(conn != null){ 40 conn.rollback(); //有异常时回滚。 41 conn.setAutoCommit(true); 42 43 } 44 }catch (SQLException e1) { 45 e1.printStackTrace(); 46 }finally{ 47 try{ 48 if(conn!=null){ 49 conn.close(); 50 }if(stmt!=null){ 51 stmt.close(); 52 } 53 }catch (SQLException e1) { 54 e1.printStackTrace(); 55 } 56 } 57 } 58 59 60 61 } 62 63 }
自动提交效果对比,能插入前两条记录(第三条sql语句缺失into)第三条sql不会执行。
//conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values(60,‘CPU‘,‘XUCHANG‘)");
stmt.addBatch("insert into dept2 values(61,‘CPU‘,‘XUCHANG‘)");
stmt.addBatch("insert dept2 values(62,‘CPU‘,‘XUCHANG‘)");
stmt.executeBatch();
conn.commit();
//conn.setAutoCommit(true);
时间: 2024-11-09 10:22:58