JDBC——事务

基本介绍

  1. JDBC 程序中当一个 Connection 对象创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚
  2. JDBC 程序中为了让多个 SQL 语句作为一个整体执行,需要使用事务
  3. 调用 ConnectionsetAutoCommit(false) 可以取消自动提交事务
  4. 在所有的 SQL 语句都成功执行后,调用 Connectioncommit(); 方法提交事务
  5. 在其中某个操作失败或出现异常时,调用 Connectionrollback(); 方法回滚事务

转账案例



package Test;

import org.junit.Test;

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

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 15:05 2021/9/14
 */
public class Test13 {

    /**
     * 不使用事务
     */
    @Test
    public void noTransaction(){
        // 连接
        Connection conn = null;
        // SQL 语句
        String sql1 = "update account set money = money - 1000 where id = 100";
        String sql2 = "update account set money = money + 1000 where id = 200";
        // PreparedStatement
        PreparedStatement ps = null;
        try{
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql1);
            ps.executeUpdate(); // 执行第一条 SQL 语句

            // 模拟异常的发生
            int i = 1 / 0;

            ps = conn.prepareStatement(sql2);
            ps.executeUpdate(); // 执行第二条 SQL 语句

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, ps, conn);
        }

    }

    /**
     * 使用事务
     */
    @Test
    public void useTransaction(){
        // 连接
        Connection conn = null;

        // SQL 语句
        String sql1 = "update account set money = money - 1000 where id = 100";
        String sql2 = "update account set money = money + 1000 where id = 200";

        // PreparedStatement
        PreparedStatement ps = null;

        try{
            conn = JDBCUtils.getConnection(); // 默认情况下,connection 是自动提交的
            conn.setAutoCommit(false); // 关闭自动提交,开启事务

            ps = conn.prepareStatement(sql1);
            ps.executeUpdate(); // 执行第一条 SQL 语句

            // 模拟异常发生
            // int i = 1 / 0;

            ps = conn.prepareStatement(sql2);
            ps.executeUpdate(); // 执行第二条 SQL 语句

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

        } catch (SQLException e) {
            // 这里我们可以进行回滚,即撤销执行的 SQL 语句
            // 可以传入一个回滚点参数,如果没有回滚点,则默认回滚到事务开启的状态
            System.out.println("执行 SQL 语句时发生异常,撤销执行的 SQL 语句");
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null, ps, conn);
        }

    }


}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值