JDBC:事务管理

JDBC控制事务:

在日常生活中我们能看见各式各样的数据更改,如:转账,但如果由于操作异常,导致转账失败,钱会不会损失呢?
今天就让我们了解一下JDBC的事务管理的机制!

1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

2.操作:

  • 开启事务
  • 提交事务
  • 回滚事务

3.使用Connection对象来管理事务

  • 开启事务:
    • 调用该方法,设置参数为 false,即开启事务。
      setAutoCommit(boolean autoCommit)
    • 创建连接后,在执行SQL前开启事务
//            开启事务
            conn.setAutoCommit(false);
  • 提交事务:commit()
    • 当所有SQL执行完后提交事务
//            提交事务
            conn.commit();
  • 回滚事务:rollback()
    • 在catch中回滚事务
try {
                if(conn!= null){
//                事务回滚
                conn.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }

业务说明:

  • 张三和李四的账户各有1000
  • 张三(zhangsan)给李四(lisi)转账500
  • 在出现异常时,未添加事务和添加事务得到的结果。

执行效果:

  • 当前账户:
    在这里插入图片描述
  • 未添加事务的异常操作(by zero):

//          执行SQL
            i = pstmt1.executeUpdate();
            int count = 1/0;
           accept =  pstmt2.executeUpdate();
  • 控制台信息:
    在这里插入图片描述
  • 账户异常:
    在这里插入图片描述
    说明:这里出现了一个by zero的算术异常,导致转账业务中,收账方(lisi)更改数据失败。

添加事务操作后:

  • 用户账户
    在这里插入图片描述
  • 控制台信息
    在这里插入图片描述
    说明:添加事务操作以后,即便出现了by zero的算术异常,但是有了回滚机制,用户账户的数据不会出现异常,保障了账户的安全。

正常转账的效果

  • 当前账户
    在这里插入图片描述

  • 转账成功后

    • 控制台信息

      在这里插入图片描述

    • 账户信息

在这里插入图片描述

  • 完整代码:

import util.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @author: seh
 * @date: 2020/10/3 9:19
 * @version: 1.0
 */
/*
* JDBC 事务管理 完成转账 业务
*
* */
public class JDBCDemo6 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;
        int i = 0;
        int accept = 0;
        try {
//          1.获取数据库连接
            conn = JDBCUtils.getConnection();
//            开启事务
            conn.setAutoCommit(false);
//            2.定义SQL语句
            String sql1 = "update account set money = money - ? where id = ? ";
            String sql2= "update account set money = money + ? where id = ? ";
//            3.获取SQL的对象
           pstmt1 = conn.prepareStatement(sql1);
           pstmt2= conn.prepareStatement(sql2);
//          4.给 ? 赋值
            pstmt1.setInt(1,500);
            pstmt1.setInt(2,1);

            pstmt2.setInt(1,500);
            pstmt2.setInt(2,2);

//          执行SQL
            i = pstmt1.executeUpdate();
//            int count = 1/0;
           accept =  pstmt2.executeUpdate();

//            提交事务
            conn.commit();
        } catch (Exception e) {
            try {
                if(conn!= null){
//                事务回滚
                conn.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
//            处理结果
            if(i>0 && accept >0){
                System.out.println("转账成功!");
            }else {
                System.out.println("转账失败!");
            }
            JDBCUtils.close(pstmt1,conn);
            JDBCUtils.close(pstmt2,null);
        }


    }
}
  • JDBCUtils工具类更新:

public static void close(PreparedStatement pstmt, Connection conn){
    if(pstmt!=null){
        try {
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • jdbc.properties文件更改

url=jdbc:mysql:///db2
user=root
pwd=123456
driver=com.mysql.jdbc.Driver

猜你喜欢

转载自blog.csdn.net/weixin_45088667/article/details/108908216
今日推荐