jdbc——事务

dch-21      2022-05-03     541

关键词:

银行转账案例演示

1.需求:一个账号fromAccount向另一个账号toAccount转入money元钱
2.分析:

  • 检查两个账号是否存在,不存在的话,结束转账行为
  • 检查转出账号的里金额是否充足,不充足,结束转账行为,充足的话,进行扣款money元
  • 转入账号进行增加money元
    3.数据准备参考上一篇
    https://www.cnblogs.com/dch-21/p/12920178.html
public class Test {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入出账账号:");
        String fromAccount=scanner.nextLine();
        System.out.println("请输入进账账号:");
        String toAccount=scanner.nextLine();
        System.out.println("请输入转账金额:");
        double money=scanner.nextDouble();
        oneToOne(fromAccount,toAccount,money);
    }
    public static void oneToOne(String fromAccount,String toAccount,double money){
        if(fromAccount==null||fromAccount.length()==0){
            System.out.println("输入不正确");
            return;
        }
        if(toAccount==null||toAccount.length()==0){
            System.out.println("输入不正确");
            return;
        }
        if(money<0){
            System.out.println("输入不正确");
            return;
        }
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet resultSet=null;
        try{
            connection= DBUtil.getConnection();
            String sql="select * from bank_account where account_id=?";
            ps=connection.prepareStatement(sql);
            ps.setString(1,fromAccount);
            resultSet = ps.executeQuery();
            if(!resultSet.next()){
                System.out.println("出账账号有误");
                return;
            }
            double balance = resultSet.getDouble("account_balance");

            ps=connection.prepareStatement(sql);
            ps.setString(1,toAccount);
            resultSet = ps.executeQuery();
            if(!resultSet.next()){
                System.out.println("进账账号有误");
                return;
            }

            String sql1="update bank_account set account_balance=account_balance+? where account_id=?";
            ps=connection.prepareStatement(sql1);
            ps.setDouble(1,-money);
            ps.setString(2,fromAccount);
            int i = ps.executeUpdate();
            System.out.println(i+"条数据受到影响");


            ps=connection.prepareStatement(sql1);
            ps.setDouble(1,money);
            ps.setString(2,toAccount);
            int j = ps.executeUpdate();
            System.out.println(j+"条数据受到影响");

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.closeConnection(connection,ps,resultSet);
        }
    }
}

输入
技术图片
运行前
技术图片
运行后
技术图片

转账异常演示

在转出账户转出金额之后和转入账户收入金额之前模拟空指针异常
String str = null;
System.out.println(str.length());

package practice;

import practice.jdbc.day03.DBUtil;

import java.io.InputStream;
import java.sql.*;
import java.util.Objects;
import java.util.Properties;
import java.util.Scanner;

/**
 * @Author 昊
 * @Create 2020/5/19 21:29
 * @Description
 *
 * 模拟银行一对一转账
 */
public class Test {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入出账账号:");
        String fromAccount=scanner.nextLine();
        System.out.println("请输入进账账号:");
        String toAccount=scanner.nextLine();
        System.out.println("请输入转账金额:");
        double money=scanner.nextDouble();
        oneToOne(fromAccount,toAccount,money);
    }
    public static void oneToOne(String fromAccount,String toAccount,double money){
        if(fromAccount==null||fromAccount.length()==0){
            System.out.println("输入不正确");
            return;
        }
        if(toAccount==null||toAccount.length()==0){
            System.out.println("输入不正确");
            return;
        }
        if(money<0){
            System.out.println("输入不正确");
            return;
        }
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet resultSet=null;
        try{
            connection= DBUtil.getConnection();
            String sql="select * from bank_account where account_id=?";
            ps=connection.prepareStatement(sql);
            ps.setString(1,fromAccount);
            resultSet = ps.executeQuery();
            if(!resultSet.next()){
                System.out.println("出账账号有误");
                return;
            }
            double balance = resultSet.getDouble("account_balance");


            ps=connection.prepareStatement(sql);
            ps.setString(1,toAccount);
            resultSet = ps.executeQuery();
            if(!resultSet.next()){
                System.out.println("进账账号有误");
                return;
            }

            String sql1="update bank_account set account_balance=account_balance+? where account_id=?";
            ps=connection.prepareStatement(sql1);
            ps.setDouble(1,-money);
            ps.setString(2,fromAccount);
            int i = ps.executeUpdate();
            System.out.println(i+"条数据受到影响");

            //在转出账户转出金额之后和转入账户收入金额之前模拟空指针异常
            String str = null;
            System.out.println(str.length());



            ps=connection.prepareStatement(sql1);
            ps.setDouble(1,money);
            ps.setString(2,toAccount);
            int j = ps.executeUpdate();
            System.out.println(j+"条数据受到影响");

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.closeConnection(connection,ps,resultSet);
        }
    }
}

加入空指针异常前
技术图片
加入异常后
技术图片
技术图片

解决方案

将手动提交事务改为自动提交,并设置回滚
setAutoCommit(false);
取消事务的自动提交操作,变成手动提交;默认为自动提交;true为自动提交,fals为手动提交
rollback();回滚到事务之初
releaseSavepoint(Savepoint savepoint);回滚到指定位置

事务

事务的特点:
技术图片

  • 默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。
  • 如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。
    • 开启事务:start transaction;
    • 结束事务:commit或rollback;

jdbc的事务支持

Connection.setAutoCommit(boolean flag):此方法可以取消事务的自动提交功能,值为false。
Connection.commit():进行事务提交 。
Connection.rollback():进行事务回滚。

public class Test {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入出账账号:");
        String fromAccount=scanner.nextLine();
        System.out.println("请输入进账账号:");
        String toAccount=scanner.nextLine();
        System.out.println("请输入转账金额:");
        double money=scanner.nextDouble();
        oneToOne(fromAccount,toAccount,money);
    }
    public static void oneToOne(String fromAccount,String toAccount,double money){
        if(fromAccount==null||fromAccount.length()==0){
            System.out.println("输入不正确");
            return;
        }
        if(toAccount==null||toAccount.length()==0){
            System.out.println("输入不正确");
            return;
        }
        if(money<0){
            System.out.println("输入不正确");
            return;
        }
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet resultSet=null;
        try{
            connection= DBUtil.getConnection();
            //取消事务的自动提交操作,变成手动提交
            //默认为自动提交
            //true为自动提交,fals为手动提交
            connection.setAutoCommit(false);


            String sql="select * from bank_account where account_id=?";
            ps=connection.prepareStatement(sql);
            ps.setString(1,fromAccount);
            resultSet = ps.executeQuery();
            if(!resultSet.next()){
                System.out.println("出账账号有误");
                return;
            }
            double balance = resultSet.getDouble("account_balance");


            ps=connection.prepareStatement(sql);
            ps.setString(1,toAccount);
            resultSet = ps.executeQuery();
            if(!resultSet.next()){
                System.out.println("进账账号有误");
                return;
            }

            String sql1="update bank_account set account_balance=account_balance+? where account_id=?";
            ps=connection.prepareStatement(sql1);
            ps.setDouble(1,-money);
            ps.setString(2,fromAccount);
            ps.executeUpdate();
           

            //在转出账户转出金额之后和转入账户收入金额之前模拟空指针异常
            String str = null;
            System.out.println(str.length());



            ps=connection.prepareStatement(sql1);
            ps.setDouble(1,money);
            ps.setString(2,toAccount);
            ps.executeUpdate();
           

        }catch (Exception e){
            e.printStackTrace();
            //如果中途出现异常,会回滚到事务之初
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }finally {
            DBUtil.closeConnection(connection,ps,resultSet);
        }
    }
}

技术图片

事务种类jdbc,hibernate,jta事务

JDBC事务StringURL="jdbc:sqlserver://localhost:1433;databaseName=test2";StringUSER="sa"; StringPASSWORD="sapassword"; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connectio 查看详情

javaweb5.6jdbc:jdbc控制事务转账案例(代码片段)

1packagecom.yub4by.jdbc;23/*4JDBC控制事务561.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。72.操作:81.开启事务92.提交事务103.回滚事务113.使用Connection对象来管理事... 查看详情

jdbc事务

JDBC事务如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务-提高性能保持业务流程的完整性... 查看详情

javaweb_jdbc_jdbc处理事务

JDBC_JDBC处理事务1.事务概述在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当... 查看详情

jdbc浅谈

JDBC中的事务  简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败。  1、事务控制的位置    在Service中的业务方法内进行事务控制。  2、事务控制的代码    a、注意:JDBC会自动把一条增... 查看详情

如何在 JDBC 中启动事务?

】如何在JDBC中启动事务?【英文标题】:HowtostartatransactioninJDBC?【发布时间】:2011-06-2320:41:53【问题描述】:Connection.setTransactionIsolation(int)警告:注意:如果在事务期间调用此方法,则结果是实现定义的。这就引出了一个问题:... 查看详情

jdbc事务

...但是有三个原因需要考虑是否关闭自动提交并管理自己的事务-提高性能保持业务流程的完整性使用分布式事务事务能够控制何时更改提交并应用于数据库。它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,... 查看详情

jdbc事务处理&批量处理

事务处理就是当执行多个SQL指令,因某个指令有误,则取消执行所有的命令它的作用是保证各项的完整性和一致性 JDBC的数据操作时commit():提交事务rollback():回退事务绝位于java.sql.Connection接口类中 JDBC中的事务操作时默... 查看详情

jdbc实现jdbc实现银行的转账事务

JDBC中的事务是默认提交的,也就是说每执行一次PreparedStatement,那么数据就会被写入到磁盘。如果需要关闭默认提交,使用 voidsetAutoCommit(false) .db.propertiesdriverClassName=oracle.jdbc.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:xeuse 查看详情

jdbc-02

...些基本操作,现在我们再一次进行深入的学习。 正文事务  首先,我们来学习的是JDBC中事务的运用,那么让我们再次了解一下事务的概念。事务的概念  事务指的是逻辑上的一组操作,组成这组操作各个逻辑单元要么... 查看详情

使用 JDBC 3.0 实现对嵌套事务的支持

】使用JDBC3.0实现对嵌套事务的支持【英文标题】:ImplementingsupportfornestedtransactionsusingJDBC3.0【发布时间】:2009-02-0618:57:19【问题描述】:我们的旧版应用程序使用JDBC3.0。它通过实现自己的事务管理器来支持事务,该事务管理器能... 查看详情

jdbc事务(代码片段)

JDBC完结撒花~~~~~~~~【JDBC】事务数据库事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。事务处理的原则:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当... 查看详情

将 JOOQ 查询与 JDBC 事务混合

】将JOOQ查询与JDBC事务混合【英文标题】:MixJOOQquerywithJDBCtransaction【发布时间】:2021-09-1608:29:23【问题描述】:我有一个用例,我想将jdbc事务与jooq上下文混合。JDBC代码如下所示:publicvoidinTransaction(InTransactionlambda)DataSourceds=dataSo... 查看详情

spring-jdbc模板-事务

Spring-JDBC模板-事务1.事务概述什么是事务逻辑上的一组操作,组成这组操作的各个单元要么全部成功要么全部失败事务的特点ACID原子性:事务不可分割(事务要么成功,要么失败)一致性:事务前后数据完整性保持一致(事务操作前后数... 查看详情

jdbc事务

一、什么是事务  事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态。   事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性... 查看详情

jdbc与spring事务及事务传播性原理解析-上篇(代码片段)

...我们主要介绍下JDBC的各种简单操作,例如增删改查、事务、事务保存点,以及介绍下Spring的传播机制,同时试着简单说明下Spring事务传播机制是怎样操作JDBC事务的组装来实现的。1、基本操作​首先我们来看下jdbc的... 查看详情

jdbc中的事务和批处理batch

JDBC事务处理:事务处理一般在事务开始前把事务提交设置为false所有DML语句执行完成后提交事务demo:packagecom.xzlf.jdbc;importjava.sql.Connection;importjava.sql.Date;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.S 查看详情

jdbc事务

...的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行的时,我们就应该为这多条语句定义一个事务。   其中,银行转账这一事例,最能说明,使用事务的重要... 查看详情