JDBC 事务

news2024/9/29 5:37:35

文章目录

  • 准备数据
  • JDBC操作事务
  • API介绍
  • 案例代码
  • 小结

在这里插入图片描述


准备数据

# 创建一个表:账户表.
create database day05_db;
# 使用数据库
use day05_db;
# 创建账号表
create table account(
	id int primary key auto_increment,
	name varchar(20),
	money double
);
# 初始化数据
insert into account values (null,'a',1000);
insert into account values (null,'b',1000);

JDBC操作事务

在这里插入图片描述

API介绍

Connection接口中与事务有关的方法

  1. void setAutoCommit(boolean autoCommit) throws SQLException;
    false:开启事务, true:关闭事务
    
  2. void commit() throws SQLException;
    提交事务
    
  3. void rollback() throws SQLException;
    回滚事务
    

说明:

注意:在jdbc事务操作中,事务的控制都是通过 Connection对象完成的,当一个完整的业务操作前,我们首先使用conn.setAutoCommit(false)来开启事务。默认情况下是true的,表示关闭事务,那么一条sql语句就是一个事务,默认提交事务。如果设置为false,那么表示开启事务,所有的sql语句就会都在一个事务中。

当业务操作完成之后,如果整个操作没有问题,我们需要使用conn.commit()来提交事务。当然了,如果出现了异常,我们需要使用conn.rollback()撤销所有的操作,所以出现异常,需要进行事务的回滚


案例代码

如下是使用jdbc操作事务的转账案例代码。

需求:a转给b 100元。

分析:

a用户 money=money-100

b用户 money=money+100

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

public class JDBCTest08 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst1 = null;
        PreparedStatement pst2 = null;
        //生成try-catch-finally代码块快捷键:ctrl+alt+T,不要选中释放资源的代码
        try {
        /*
            需求:使用jdbc控制mysql事务。
            使用Connection接口中的方法:
                1.开启手动控制事务:void setAutoCommit(false)
                2.一切正常,提交事务:void commit()
                3.出现异常,回滚事务: void rollback()
         */
            //使用事务完成a给b转账100元
            //a-100
            //b+100
            //1.注册驱动
//        DriverManager.registerDriver(new Driver());
            //2.获取数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day03_heima139", "root", "1234");
            //开启手动控制事务 == 1.开启手动控制事务:void setAutoCommit(false)
            conn.setAutoCommit(false);
            //3.获取发送sql语句的预编译对象
            // a-100
            pst1 = conn.prepareStatement("update account set money=money-100 where name=?");

            // b+100
            pst2 = conn.prepareStatement("update account set money=money+100 where name=?");
            //4.发送sql语句
            //给占位符赋值
            pst1.setString(1, "a");
            pst2.setString(1, "b");

            //5.发送sql语句
            pst1.executeUpdate();

            //模拟异常

//            int i = 1 / 0;

            pst2.executeUpdate();

            //2.一切正常,提交事务:void commit()
            conn.commit();

        } catch (Exception throwables) {
            throwables.printStackTrace();
            try {
                //3.出现异常,回滚事务: void rollback()
                if (conn != null) {
                    conn.rollback();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        } finally {
            //5.处理结果
            //6.释放资源
            try {
                if (pst2 != null) {//防止空指针异常
                    pst2.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

            try {
                if (pst1 != null) {//防止空指针异常
                    pst1.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if (conn != null) {//防止空指针异常
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }


    }
}


小结

JDBC中与事务相关的API?Connection接口中setAutoCommit,commit,rollback

JDBC操作事务的步骤?

  1. 注册驱动
  2. 获取连接
  3. 获取到Statement
  4. 开启事务
  5. 使用Statement执行SQL
  6. 提交或回滚事务
  7. 关闭资源






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何管理自己的工作任务和时间

在当今快节奏的工作环境中,有效地管理工作任务和时间是取得成功和保持工作生活平衡的关键。以下是一些实用的方法,可以帮助你更好地掌控自己的工作。 一、明确工作任务 1、制定任务清单 每天开始工作前,列出当天需要完成的所有任务。可以使用…

PWA(Progressive web APPs,渐进式 Web 应用)

文章目录 引言I 什么是 PWA功能特性II Web 应用清单引言 PWA 是 Google 于 2016 年提出的概念,于 2017 年正式落地,于 2018 年迎来重大突破,全球顶级的浏览器厂商,Google、Microsoft、Apple 已经全数宣布支持 PWA 技术。 PWA 目的是通过各种 Web 技术实现与原生 App 相近…

Java读取YAML文件

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

基于注意力机制的图表示学习:GRAPH-BERT模型

人工智能咨询培训老师叶梓 转载标明出处 图神经网络(GNNs)在处理图结构数据方面取得了显著的进展,但现有模型在深层结构中存在性能问题,如“悬挂动画问题”和“过平滑问题”。而且图数据内在的相互连接特性限制了大规模图输入的并…

三天搞了7000,AI绘本副业赚钱新途径,抓住绘本创业,轻松开启副业

**项目简介:**这个项目的原理是利用AI文本工具来编写绘本故事脚本、人物描述及场景设定,完成整个绘本内容的创作。接着,使用百度翻译将文本翻译成英文,并在MJ软件上输入关键词生成相应的图片。随后,将这些图片上传至Pi…

《我的世界:地下城》风灵月影修改器使用指南 —— 掌控冒险,轻松畅游

对于热爱《我的世界:地下城》并寻求更加个性化游戏体验的玩家来说,风灵月影修改器提供了一个强大而便捷的辅助工具。 以下简要步骤将指导你如何安全高效地利用此修改器,让你的探险之旅如虎添翼。 1.下载与安装: 首先&#xff0c…

ESP32 入门笔记02: ESP32-C3 系列( 芯片ESP32-C3FN4) (ESP-IDF + VSCode)

ESP32-C3 系列的 芯片 / 模组 / 开发板 ESP32-C3-DevKitM-1是乐鑫一款搭载 ESP32-C3-MINI-1 或 ESP32-C3-MINI-1U 模组的入门级开发板(内置 ESP32-C3FH4 或 ESP32-C3FN4 芯片)。 板上模组大部分管脚均已引出至两侧排针,可根据开发实际需求&a…

Android平台RTMP推送模块的设计意义

为什么要做RTMP推送 RTMP是一种广泛使用的流媒体传输协议,它允许视频和音频数据在互联网上实时、高效地传输。实现RTMP推送功能,主要是为了满足以下需求: 实时性要求:RTMP协议具有低延迟的特点,适合用于需要实时交互的…

大数据毕业设计选题推荐-租房数据分析系统-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

LVS-DR实战案例,实现四层负载均衡

环境准备:三台虚拟机(NET模式或者桥接模式) 192.168.88.200 (web1)(安装nginx服务器作为测试) 192.168.88.201 (服务器)(用于部署lvs-dr) 192.168.88.202 (web2)…

Ubuntu20.04 安装汉语拼音后重启登入黑屏

在虚拟机上装了一个Ubuntu用来学C,默认没有安装中文输入。于是按照网上教程装了几个汉语包。切换输入法的时候突然死机,重启登入直接黑屏。百度后发现有不少老哥和我这个问题一模一样,按照他们的方法也终于整好了,虚惊一场。 解决…

axios proxy 和 httpsAgent 的使用差异案例详解

背景 因为 wadesk 开发了本地 http 服务,http 本地服务是运行在 electron-main 的纯 node 环境中的,这个之前探讨了 node 下怎么使用 fetch 时就提到了一个 https-proxy-agent 库,这次使用 axios,发现 axios 自带 proxy 配置项&a…

Ubuntu20.04中ros2 foxy版本安装gazebo,并运行小车运动demo

这里默认你安装好了ros2 foxy版本 sudo apt install gazebo11sudo apt install ros-foxy-gazebo-ros-pkgs建议把其他的包也安装了 sudo apt install ros-foxy-gazebo-*安装速度的话,比安装ros环境快多了。 此时,可以在/opt/ros/foxy/share目录下看到若…

NXP(恩智浦)—TJA1042TK/3 CAN收发器芯片详解

写在前面 本系列文章主要讲解NXP(恩智浦)—TJA1042TK/3 CAN收发器芯片的相关知识,希望能帮助更多的同学认识和了解NXP(恩智浦)—TTJA1042TK/3 CAN收发器芯片。 若有相关问题,欢迎评论沟通,共同…

大厂再侵美团腹地

美团在拿自己的生命线,来对抗大厂们的第二曲线。 转载:新熵 原创 作者丨茯神 编辑丨九犁 中国互联网行业的“黄金年代”一去不复返后,大厂们纷纷调转航线探寻,数年间尝尽了To B、元宇宙、直播带货等酸甜苦辣。如今蓦然回首才发现…

腾讯云linux服务器修改root用户登录密码操作步骤

https://cloud.tencent.com/loginhttps://cloud.tencent.com/login 点击上面链接 登录腾讯云控制台 在打开页面 确认服务器后 点 登录 按钮 操作命令: sudo passwd root 密码设置不小于16位 字母大小写数字加特殊符号组合 修改成功后关闭登录窗口即可。

9.26号算法题

数组的遍历 414.第三大的数 题解&#xff1a; class Solution {public int thirdMax(int[] nums) {TreeSet<Integer>treeSet new TreeSet<Integer>(); //生成一个TreeSet对象&#xff0c;存储有序唯一整数for (int num : nums){//遍历数组treeSet.add(num);//将…

C语言实现常见的数据结构

栈 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构 #include <stdio.h> #include <stdlib.h>#define MAX 100typedef struct {int data[MAX];int top; } Stack;// 初始化栈 void init(Stack *s) {s->top -1; }// 判断栈是否为空…

观测云产品更新 | 场景、基础设施、用户访问、管理等

观测云更新 Breaking Changes 拨测标签&#xff1a;字段名由 tags.info 调整为 df_label 。 场景 1、仪表板新增历史版本记录&#xff1a;可查看此仪表板三个月内保存的版本记录&#xff0c;选中某版本后&#xff0c;可查看此版本图表详情&#xff0c;并以 json 格式、通过…

2024源代码加密软件分享TOP10丨保护源代码安全不泄露

在2024年&#xff0c;随着技术的不断进步&#xff0c;源代码加密软件也愈发成熟&#xff0c;为开发者和企业提供了更强大的保护手段&#xff0c;以应对日益严峻的数据安全挑战。以下是本年度推荐的TOP10源代码加密软件&#xff0c;它们各自具有独特的优势和特点&#xff0c;能够…