您的位置:首页 > 其它

JDBC03 利用JDBC实现事务提交与回滚【调用Connection中的方法实现事务管理】

2017-07-07 17:04 627 查看
目录

  1 Connection中的重用方法

  2 JDBC事务管理经典案例

1 Connection类中常用的方法回顾

  1.1 Statement createStatement() throws SQLException;

    创建一个Statement实例(即:创建一个SQL执行对象)

  1.2 PreparedStatement prepareStatement(String sql) throws SQLException;

    创建一个PreparedStatement对象(即:创建一个预编译SQL执行对象)

  1.3 void setAutoCommit(boolean autoCommit) throws SQLException;

    设置事务的自动提交(false为关闭自动提交,true为启动自动提交)

  1.4 void commit() throws SQLException;

    手动提交事务

  1.5 void rollback() throws SQLException;

    手动回滚事务

2 需要用到事务回滚的经典案例:银行转账案例

  转出和转入是一个事务,如果转出成功但是转入失败的会就需要进行事务回滚,否则就出出现转出者余额减少但是转入者余额没有增加

  注意:事务的提交与回滚是通过Connection提供的方法来调用的;本质上事务还是依赖数据库的实现;Connection的方法实质上也是调用了数据库事务机制.

  2.1 不使用事务控制的转账业务

    缺点:如果转入成功,但是转入失败的话,会造成转出者余额减少,但是转入者余额不变

    项目结构图

      

1 package cn.xiangxu.entity;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.SQLException;
6 import java.util.Scanner;
7
8 import cn.xiangxu.tools.DBUtil;
9
10 public class Test {
11     public static void main(String[] args) {
12         Scanner scanner = new Scanner(System.in);
13         System.out.println("请输入转出用户名:");
14         String outName = scanner.nextLine();
15         System.out.println("请输入需要转出的资金额度:");
16         Double money = Double.parseDouble(scanner.nextLine());
17         System.out.println("请输入转入用户名:");
18         String inName = scanner.nextLine();
19         System.out.println("转出账户为:" + outName + "转出金额为:" + money + "转入账户为:" + inName);
20
21
22         Connection conn = null;
23         try {
24             conn = DBUtil.getConnection(); // 实例化连接对象
25
26             DBUtil.tansBegin(); // 关闭自动提交事务功能
27
28             String sql = "UPDATE client "
29                     + "SET account = account - ? "
30                     + "WHERE name = ? ";
31             PreparedStatement ps = conn.prepareStatement(sql);
32             ps.setDouble(1, money);
33             ps.setString(2, outName);
34             Integer rs = ps.executeUpdate();
35             if(rs > 0) {
36                 System.out.println("转出成功");
37             } else {
38                 System.out.println("转出失败");
39                 return; // 转出失败跳出函数,不再执行下面的语句;但是finally中的语句还是会执行的,因为就算天塌下来finally中的语句都会执行
40             }
41
42             System.out.println("======分割线=======");
43
44             String sql_in = "UPDATE client "
45                     + "SET account = account + ? "
46                     + "WHERE name = ? ";
47             PreparedStatement ps_in = conn.prepareStatement(sql_in);
48             ps_in.setDouble(1, money);
49             ps_in.setString(2, inName);
50             Integer judge_in = ps_in.executeUpdate();
51             if(judge_in > 0) {
52                 System.out.println("转入成功");
53                 DBUtil.transCommit(); // 转出、转入都成功就提交事务
54             } else {
55                 System.out.println("转入失败");
56                 DBUtil.transBack(); // 转出成功、转入失败就回滚事务
57             }
58
59         } catch (Exception e) {
60             // TODO Auto-generated catch block
61             try {
62                 DBUtil.transBack();// 捕获到异常后也需要进行事务回滚
63             } catch (SQLException e1) {
64                 // TODO Auto-generated catch block
65                 e1.printStackTrace();
66             }
67             e.printStackTrace();
68         } finally {
69             System.out.println("我是finally中的语句哟");
70             try {
71                 DBUtil.closeConnection();
72             } catch (Exception e) {
73                 // TODO Auto-generated catch block
74                 e.printStackTrace();
75             }
76         }
77     }
78 }


转账业务java源代码

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: