JavaWeb5.6【JDBC:JDBC控制事务、转账案例】

 1 package com.yub4by.jdbc;
 2 
 3 /*
 4 JDBC控制事务
 5 
 6 1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
 7 2. 操作:
 8     1. 开启事务
 9     2. 提交事务
10     3. 回滚事务
11 3. 使用Connection对象来管理事务
12     * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
13         * 在执行sql之前开启事务
14     * 提交事务:commit()
15         * 当所有sql都执行完提交事务
16     * 回滚事务:rollback()
17         * 在catch中回滚事务
18  */
19 
20 import com.yub4by.util.JDBCUtils;
21 
22 import java.sql.Connection;
23 import java.sql.PreparedStatement;
24 import java.sql.SQLException;
25 
26 /**
27  * 案例-转账
28  */
29 public class JDBCDemo10 {
30     public static void main(String[] args) {
31         Connection conn = null;
32         PreparedStatement pstmt1 = null;
33         PreparedStatement pstmt2 = null;
34 
35         try {
36             conn = JDBCUtils.getConnection();
37             //开启事务
38             conn.setAutoCommit(false);
39 
40             String sql1 = "update account set balance = balance - ? where id = ?";
41             String sql2 = "update account set balance = balance + ? where id = ?";
42             pstmt1 = conn.prepareStatement(sql1);
43             pstmt2 = conn.prepareStatement(sql2);
44 
45             pstmt1.setDouble(1, 500);
46             pstmt1.setInt(2, 1);
47             pstmt2.setDouble(1, 500);
48             pstmt2.setInt(2, 2);
49 
50             pstmt1.executeUpdate();
51             // ---------------------------
52             // 手动制造异常
53 //            int i = 3/0; //java.lang.ArithmeticException: / by zero
54             // ---------------------------
55             pstmt2.executeUpdate();
56 
57             //提交事务(执行到此,没有出现异常,就提交)
58             conn.commit();
59 
60         } catch (Exception e) { //注意因为只要出异常就会回滚,所以可能发生各种异常,故SQLException --> Exception
61             //事务回滚
62             try {
63                 if (conn != null){
64                     conn.rollback();
65                 }
66             } catch (SQLException e1) {
67                 e1.printStackTrace();
68             }
69 
70             e.printStackTrace();
71         } finally {
72             JDBCUtils.close(pstmt1, conn);
73             JDBCUtils.close(pstmt2, null);
74         }
75     }
76 }

 

posted @ 2021-06-25 17:46  yub4by  阅读(67)  评论(0编辑  收藏  举报