JDBC事务开启、事务提交、事务回滚 -- 转账演示

JDBC事务开启、事务提交、事务回滚--转账演示

1、转账前:

2、代码:

package com.happy.lesson1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;

//转账演示
public class JDBCTest11 {
    public static void main(String[] args) {
        ResourceBundle bundle = ResourceBundle.getBundle("JDBC");
        String driver = bundle.getString("driver");
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");
        Connection conn = null;
        PreparedStatement ps = null;
        int count = 0;
        try {
            //1.注册驱动
            Class.forName(driver);

            //2.获取连接
            conn = DriverManager.getConnection(url,user,password);

            //关闭自动提交(开启事务)
            conn.setAutoCommit(false);

            //3.获取数据库操作对象
            String sql = "update t_act set balance = ? where actno = ?";//处理sql语句
            ps = conn.prepareStatement(sql);

            //传值
            //111转账10000元给222
            ps.setDouble(1,10000);
            ps.setInt(2,111);
            //4.1执行sql
            count = ps.executeUpdate();

            //发生异常
            int e = 1/0;

            //222收到转账10000元
            ps.setDouble(1,10000);
            ps.setInt(2,222);
            //4.2执行sql
            count += ps.executeUpdate();

            //提交事务
            conn.commit();

        } catch (Exception e) {
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            //5.处理结果集
            System.out.println((count==2)?"转账成功":"转账失败");

            //6.关闭资源
            try {
                if (ps != null){
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}

3、运行代码,转账发生异常时

111的金额还是20000元,222金额还是0元,金额没有因为异常而丢失,说明事务事件起了作用。

4、修复异常,再运行代码

idea软件没有报错,数据库数据也显示正常,说明代码正常,转账成功!

5、改动了哪些地方

5.1 用try{}catch{}finally{}捕捉异常代替直接抛出异常

因为发现发生异常后,后面的代码都无法执行了,例如发生异常后,后面的事务回滚也执行不到了

5.2 事务的3条重要代码

//关闭自动提交(开启事务)
conn.setAutoCommit(false);

//提交事务
conn.commit();

//事务回滚
conn.rollback();

5.3 把处理结果集放到了finally{}中

因为我想在控制台看是否转账成功,无论是否发生异常。

5.4 提升作用域

Connection conn = null;
PreparedStatement ps = null;
int count = 0;

就是放在try的外面,让finally也能访问到

5.5 简单的异常

//发生异常
int e = 1/0;

5.6 结果累加

count += ps.executeUpdate();

明确只影响2条数据库数据,以便更好的处理结果集

posted @ 2021-07-08 17:10  初中生林开心  阅读(302)  评论(0)    收藏  举报