JDBC事务

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事务特性 ACID
1)原子性(atomicity):事务必须是原子工作单元;对其数据修改,要么全都执行,要么全都不执行【最小的工作单位】
2)一致性(consistency):事务在完成时,必须使所有的数据都保持一致状态【同时成功或者同时失败】
3)隔离性(isolation):由并发事务所作的修改必须与任何其他并发事务所作的修改隔离【事务与事务之间相互不影响】
4)持久性(durability):事务完成之后,它对于系统的影响是永久性的【事务一旦提交不可回滚】

核心代码:将JDBC自动提交关闭,改成手动提交,然后在让出错的事务在异常里捕获成回滚。这样保证了提交事务出错数据不改动。从而达到数据的正确性。

// JDBC自动提交关闭,改成手动提交
connection.setAutoCommit(false);
// 手动提交
connection.commit();
// 如果事务出错,就让他它回滚
connection.rollback();

详细代码测试:

 1 package boom;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 
 9 /**
10  * 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
11  * 原子性:最小的工作单位
12  * 一致性:同时成功或者同时失败
13  * 隔离性:事务与事务之间相互不影响
14  * 持久性:事务一旦提交不可回滚
15  * @author Administrator
16  *
17  */
18 public class JDBC_test06 {
19     public static void main(String[] args) {
20         // 声明参数
21         String driver = "oracle.jdbc.driver.OracleDriver";
22         String url = "jdbc:oracle:thin:@localhost:1521:XE";
23         String username = "scott";
24         String userpwd = "tiger"; 
25         
26         // 声明连接
27         Connection connection = null;
28         PreparedStatement ps  = null;
29         ResultSet resultSet = null;
30         
31         try {
32             //1.加载驱动
33             Class.forName(driver);
34             //2.创建连接
35             connection = DriverManager.getConnection(url, username, userpwd);
36             
37             // JDBC自动提交关闭,改成手动提交
38             connection.setAutoCommit(false);
39             //3.发送SQL语句
40             String update01 = "update comm set sal=sal+1000 where id=1";
41             String update02 = "update comm set saddl=sal-1000 where id=2";
42             //4.获取资源
43             ps = connection.prepareStatement(update01);
44             int n1 = ps.executeUpdate();
45             //5.处理结果
46             if(n1>0){
47                 System.out.println("JDBC_test06.main(测试成功01)");
48             }
49             ps = connection.prepareStatement(update02);
50             int n2 = ps.executeUpdate();
51             if(n2>0){
52                 System.out.println("JDBC_test06.main(测试成功02)");
53             }
54             // 手动提交
55             connection.commit();
56             
57         } catch (ClassNotFoundException | SQLException e) {
58             try {
59                 // 如果事务出错,就让他它回滚
60                 connection.rollback();
61             } catch (SQLException e1) {
62                 // TODO Auto-generated catch block
63                 e1.printStackTrace();
64             }
65             e.printStackTrace();
66         }finally {
67             try {
68                 if(ps!=null)
69                 ps.close();
70             } catch (SQLException e) {
71                 e.printStackTrace();
72             }
73             try {
74                 if(connection!=null)
75                     connection.close();
76             } catch (SQLException e) {
77                 e.printStackTrace();
78             }
79         }
80     }
81 } 
View Code

故意写错第二条SQL语句,但是第一条SQL语句还是可以正常执行。但因为在异常里捕捉了回滚事务。所以数据并无变化

原文地址:https://www.cnblogs.com/cao-yin/p/9775110.html