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 }