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);


 

欢迎关注个人公众号一起交流学习: