首页 > 其他分享 >JDBC p3 事务

JDBC p3 事务

时间:2023-07-27 20:44:27浏览次数:42  
标签:p3 事务 JDBC connection preparedStatement sql 100 balance

事务

  • 基本介绍

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

    MySQL代码:

    CREATE TABLE account(
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	name VARCHAR(32) NOT NULL DEFAULT '',
    	balance DOUBLE NOT NULL DEFAULT 0
    ) CHARACTER SET utf8;
    
    INSERT INTO account VALUES(NULL, '马云', 3000);
    INSERT INTO account VALUES(NULL, '马化腾', 10000);
    
    SELECT * FROM account;
    

    Java代码:

    package com.hspedu.jdbc.transaction_;
    
    import com.hspedu.jdbc.utils.JDBCUtils;
    import org.junit.jupiter.api.Test;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    /**
     * Description: 演示在jdbc 中如何使用事务
     */
    public class Transaction_ {
    
        //没有使用事务,模拟银行转账出现异常
        @Test
        public void noTransaction(){
            //1. 得到连接
            Connection connection = null; //默认情况下,connection 默认自动提交, 执行一句sql语句,就会提交事务
    
            //2. SQL语句
            String sql = "update account set balance = balance - 100 where id = ?";
            String sql2 = "update account set balance = balance + 100 where id = ?";
    
            PreparedStatement preparedStatement = null;
    
            //3. 创建PreparedStatement 对象
            try {
    
                connection = JDBCUtils.getConnection();
    
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setInt(1, 1);
                preparedStatement.executeUpdate();
    
                 int i = 1 / 0; //抛出异常接下来的语句就不会执行
                preparedStatement = connection.prepareStatement(sql2);
                preparedStatement.setInt(1, 2);
    
                preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //关闭资源
                JDBCUtils.close(null, preparedStatement, connection);
            }
        }
    
    
        //使用事务
        @Test
        public void UseTransaction() {
            //1. 得到连接
            Connection connection = null; //默认情况下,connection 默认自动提交, 执行一句sql语句,就会提交事务
    
            //2. SQL语句
            String sql = "update account set balance = balance - 100 where id = ?";
            String sql2 = "update account set balance = balance + 100 where id = ?";
    
            PreparedStatement preparedStatement = null;
    
            //3. 创建PreparedStatement 对象
            try {
    
                connection = JDBCUtils.getConnection();
                connection.setAutoCommit(false);//相当与开启了事务
    
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setInt(1, 1);
                preparedStatement.executeUpdate();
    
                int i = 1 / 0; //抛出异常接下来的语句就不会执行
                preparedStatement = connection.prepareStatement(sql2);
                preparedStatement.setInt(1, 2);
                preparedStatement.executeUpdate();
    
                //这里提交事务
                connection.commit();
            } catch (SQLException  | ArithmeticException  e) {
                System.out.println("执行发生了异常,撤销执行的SQL");
                e.printStackTrace();
                //可以在这里进行回顾,即撤销执行的sql语句
                try {
                    connection.rollback();//默认回滚到事务开始的时候,可以填入回滚点savePoint
                } catch (SQLException ex) {
                    throw new RuntimeException(ex);
                }
            } finally {
                //关闭资源
                JDBCUtils.close(null, preparedStatement, connection);
            }
        }
    }
    
    
    1. 模拟1号向2号转账100元转账异常,调用noTransaction()方法,不使用事务,可以发现结果如下:

      发生异常后,1号的存款转出了 100元,2号没有收到100元,100元没了。

    2. 如果调用的是useTransaction()方法,使用事务(connection.setAutoCommit(false) 取消事务自动提交)结果如下:

      没有变化,控制台打印了 “执行发生了异常,撤销执行的SQL”,出现了异常后try-catch并进行了事务的回滚

标签:p3,事务,JDBC,connection,preparedStatement,sql,100,balance
From: https://www.cnblogs.com/zh-Note/p/17583081.html

相关文章

  • Java 是串行事务吗
    Java是串行事务吗?在计算机领域,事务是指一系列操作被看作一个单独的工作单元,并且要么全部执行成功,要么全部失败。在并发编程中,事务管理是非常重要的一个概念,因为它可以确保数据的一致性和完整性。在Java中,事务管理可以通过使用数据库事务或者编程事务的方式来实现。什么是串行......
  • android studio okhttp3.x和okhttp4.x共存
    AndroidStudio中实现OkHttp3.x和OkHttp4.x共存的步骤概述在Android开发过程中,我们常常会用到网络请求库OkHttp来进行网络请求操作。有时候,我们可能需要同时使用不同版本的OkHttp库来满足不同的需求。本文将详细介绍如何在AndroidStudio中实现OkHttp3.x和OkHttp4.x的共存。步骤......
  • SFP3012-ASEMI快恢复二极管参数、规格、尺寸
    编辑:llSFP3012-ASEMI快恢复二极管参数、规格、尺寸型号:SFP3012品牌:ASEMI芯片个数:2芯片尺寸:102MIL*2封装:TO-247恢复时间:65ns工作温度:-40°C~175°C浪涌电流:160*2正向电流:30A反向耐压:1200V正向压降:1.75V引脚数量:3漏电流:>10uaSFP3012二极管特性:SFP3012快恢复二极管广......
  • 分布式事务两阶段提交和三阶段提交有什么区别?
    在分布式事务中,通常使用两阶段协议或三阶段协议来保障分布式事务的正常运行,它也是X/Open公司定义的一套分布式事务标准。X/Open公司是由多家国际计算机厂商所组成的联盟组织,它建立之初是为了向UNIX环境提供标准。分布式事务是指在分布式系统中,多个节点之间进行的事务操作......
  • P3704 [SDOI2017] 数字表格 题解
    一、题目描述:用$f_i$表示斐波那契数列的第$i$项,那么有:$f_0=0,f_1=1;f_n=f_{n-1}+f_{n-2},n\ge2$现在有一个$n$行$m$列的数字表格,第$i$行第$j$列的数字是$f_{\gcd(i,j)}$。求这个表格所有数的乘积。共有$T$组数据,答案对$10^9+7$取模。......
  • xml声明式事务控制
    1、applicationContext.xml配置<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:contex......
  • JDBC p2 JDBC API
    JDBCAPI获取数据库连接5种方式通过new创建Driver对象;使用反射加载Driver类,动态加载,减少依赖性,更加灵活;使用DriverManager替代Driver进行统一管理,有了更好的扩展性;使用Class.forName自动完成注册驱动,简化代码;在方式4的基础上改进,增加配置文件,让mysql连接更灵活,最推荐......
  • Spring事务的传播行为
    Spring事务的七种传播行为首先举例事务的嵌套:ServiceA{voidmethodA(){ServiceB.methodB();}}ServiceB{voidmethodB(){}}其中ServiceA#methodA(我们称之为外部事务),ServiceB#methodB(我们称之为内部事务)......
  • 【项目实战】Kafka 生产者幂等性和事务
    ......
  • JDBC 工具类
    工具类JDBCUtils包括以下方法 项目结构如下 代码如下packagecom.lyl.utils;importjava.io.IOException;importjava.io.InputStream;importjava.lang.reflect.Field;importjava.sql.*;importjava.util.ArrayList;importjava.util.List;importjava.util.Pr......