【Java 进阶篇】JDBC 管理事务详解

在这里插入图片描述

在数据库操作中,事务是一个非常重要的概念。事务可以确保一系列的数据库操作要么全部成功执行,要么全部失败回滚,以保持数据库的一致性和完整性。在 Java 中,我们可以使用 JDBC 来管理事务。本文将详细介绍 JDBC 管理事务的方法和示例代码,同时面向基础小白,以简单明了的语言进行讲解。

什么是事务

在数据库中,事务是一组 SQL 操作,这些操作被视为一个单一的工作单元。事务具有以下四个关键属性,通常被称为 ACID 特性:

  • 原子性(Atomicity):事务是原子的,它要么全部成功执行,要么全部失败回滚。如果其中一个操作失败,整个事务都将失败,不会留下部分修改。

  • 一致性(Consistency):事务在执行前后,数据库从一个一致的状态转移到另一个一致的状态。这意味着事务必须遵循数据库的完整性约束,如主键、唯一性约束等。

  • 隔离性(Isolation):多个事务可以并发执行,但彼此之间不能互相干扰。一个事务的修改在提交之前对其他事务是不可见的。

  • 持久性(Durability):一旦事务提交成功,它的结果将永久保存在数据库中,即使系统发生故障也不会丢失。

JDBC 事务管理

JDBC(Java Database Connectivity)是 Java 中用于与数据库进行交互的 API。JDBC 提供了一种在 Java 程序中管理数据库事务的方式。

开启事务

要在 JDBC 中开启一个事务,您需要执行以下步骤:

  1. 创建一个数据库连接(Connection)对象。
  2. 将连接的自动提交模式设置为 false,这意味着事务不会自动提交。
  3. 在事务中执行一系列的 SQL 操作。
  4. 最后,根据操作的成功或失败,选择提交事务(commit)或回滚事务(rollback)。

以下是一个示例代码,演示如何开启一个 JDBC 事务:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class TransactionExample {public static void main(String[] args) {String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) {// 关闭自动提交,开启事务connection.setAutoCommit(false);// 执行一系列数据库操作// 提交事务connection.commit();} catch (SQLException e) {e.printStackTrace();// 发生异常,回滚事务connection.rollback();}}
}

在上述代码中,我们通过 setAutoCommit(false) 方法关闭了自动提交模式,然后在 try 块中执行一系列数据库操作。如果发生异常,我们在 catch 块中调用 rollback() 方法来回滚事务。

提交事务和回滚事务

在 JDBC 中,要提交事务,可以使用 commit() 方法,如上面的示例所示。提交事务后,其中的所有操作将成为数据库的一部分。

如果在事务过程中出现了问题,您可以使用 rollback() 方法来回滚事务,撤销所有未提交的更改,将数据库恢复到事务开始之前的状态。在上述示例中,我们在 catch 块中调用了 rollback() 方法来回滚事务。

设置事务隔离级别

在 JDBC 中,您可以设置事务的隔离级别,以控制多个事务之间的相互影响程度。JDBC 支持以下四个事务隔离级别,从低到高分别是:

  1. TRANSACTION_NONE:不支持事务。每个 SQL 语句都将自动提交,不会回滚。

  2. TRANSACTION_READ_UNCOMMITTED:允许读取未提交的数据更改。这意味着一个事务可以看到另一个事务未提交的数据。

  3. TRANSACTION_READ_COMMITTED:只允许读取已提交的数据更改。这是大多数数据库系统的默认隔离级别。

  4. TRANSACTION_REPEATABLE_READ:确保在事务中多次读取相同的数据时,数据不会发生更改。但是,其他事务仍然可以插入新的数据。

  5. TRANSACTION_SERIALIZABLE:最高隔离级别,确保事务之间完全隔离,不允许并发访问。

要设置事务隔离级别,可以使用 setTransactionIsolation() 方法。以下是一个示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class TransactionIsolationExample {public static void main(String[] args) {String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password)) {// 设置事务隔离级别为 TRANSACTION_SERIALIZABLEconnection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);// 关闭自动提交,开启事务connection.setAutoCommit(false);// 执行一系列数据库操作// 提交事务connection.commit();} catch (SQLException e) {e.printStackTrace();// 发生异常,回滚事务connection.rollback();}}
}

在上述代码中,我们通过 setTransactionIsolation() 方法将事务隔离级别设置为 Connection.TRANSACTION_SERIALIZABLE,最高级别的隔离。

事务的注意事项

在使用 JDBC 进行事务管理时,有一些重要的注意事项:

  1. 关闭连接:务必在事务结束后关闭数据库连接。可以使用 try-with-resources 或在 finally 块中关闭连接,以确保资源被正确释放。

  2. 异常处理:捕获和处理可能发生的 SQLException。在 catch 块中回滚事务以及进行适当的错误处理。

  3. 提交频率:根据需要选择何时提交事务。不要在每个 SQL 语句之后都提交,而应根据业务需求来决定提交点。

  4. 隔离级别:选择适当的事务隔离级别,以平衡并发性和一致性。更高的隔离级别会导致性能下降,因此要根据应用程序的需求进行权衡。

  5. 测试和调试:在生产环境之前对事务进行充分的测试和调试,以确保其正常工作。

结语

事务管理是数据库操作中不可或缺的一部分,它确保了数据的一致性和完整性。通过 JDBC,您可以轻松地开启、提交和回滚事务,同时可以控制事务的隔离级别,以满足不同应用程序的需求。希望本文能够帮助您更好地理解 JDBC 中的事务管理。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)

Leetcode1071. 字符串的最大公因子 对于字符串 s 和 t,只有在 s t … t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。 给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能…

【面试总结大纲】

面试 1. springSpring AOP的具体实现核心概念分别指的是什么?基于注解的切面实现主要包括以下几个步骤:两个切面,它们之间的顺序是怎么控制的 springmvc的工作流程设计模式原则Spring 框架中用到了哪些设计模式? 2. Java-锁2.1锁的分类可重入…

开发调试管理系统遇到的问题大全错误解决大全收集

问题大全错误解决大全 多模块项目依赖中,项目启动失败-org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException报错:Error: The project seems to require yarn but it‘s not installednpm ERR! fatal: Could not read fro…

动态规划-状态机(188. 买卖股票的最佳时机 IV)

状态分类: f[i,j,0]考虑前i只股票,进行了j笔交易,目前未持有股票 所能获得最大利润 f[i,j,1]考虑前i只股票,进行了j笔交易,目前持有股票 所能获得最大利润 状态转移: f[i][j][0] Math.max(f[i-1][j][0],f[…

Linux高性能服务器编程 学习笔记 第十章 信号

信号是由用户、系统、进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。Linux信号可由以下条件产生: 1.对于前台进程,用户可通过输入特殊终端字符来给它发送信号,如输入CtrlC通常会给进程发送一个中断信号。 2…

视频讲解|基于DistFlow潮流的配电网故障重构代码

目录 1 主要内容 2 视频链接 1 主要内容 该视频为基于DistFlow潮流的配电网故障重构代码讲解内容,对应的资源下载链接为基于DistFlow潮流的配电网故障重构(输入任意线路),对该程序进行了详尽的讲解,基本做到句句分析和讲解(讲解…

双重差分模型(DID)论文写作指南与操作手册

手册链接:双重差分模型(DID)论文写作指南与操作手册https://www.cctalk.com/m/group/90983583?xh_fshareuid60953990 简介: 当前,对于准应届生们来说,毕设季叠加就业季,写作时间显得十分宝贵…

Polygon Miden zkRollup中的UTXO+账户混合状态模型

1. 引言 本文重点讨论Polygon Miden所设计的UTXO账户混合状态模型,以实现某些有趣的属性。 Miden的目标是:【即越具有隐私性,其可扩展性越好】 构建可扩展去中心化的rollup采用支持隐私的架构 Miden支持灵活的交易模式: 公开…

QT实现TCP服务器客户端的实现

ser: widget.cpp: #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xf…

软件设计师_计算机网络_学习笔记

文章目录 4.1 网路技术标准与协议4.1.1 协议4.1.2 DHCP4.1.3 DNS的两种查询方式 4.2 计算机网络的分类4.2.1 拓扑结构 4.3 网络规划与设计4.3.1 遵循的原则4.3.2 逻辑网络设计4.3.3 物理网络设计4.3.4 分层设计 4.4 IP地址与子网划分4.4.1 子网划分4.4.2 特殊IP 4.5 HTML4.6 无…

BL808学习日志-2-LVGL for M0 and D0

一、lvgl测试环境 对拿到的M1S_DOCK开发板进行开发板测试,博流的官方SDK是支持M0和D0两个内核都进行测试的;但是目前只实现了M0的LVGLBenchmark,测试D0内核中发现很多莫名其妙的问题。一会详细记录。 使用的是开发板自带的SPI显示屏&#xff…

STM32复习笔记(五):FSMC连接外部SRAM

目录 Preface: (一)原理相关 (二)CUBEMX配置 (三)轮询方式读写 (四)DMA方式读写 Preface: STM32F4有一个FSMC(Flexible Static Memory Contr…

C++ YAML使用

C++工程如何使用YAML-cpp 一、前期准备工作 1、已安装minGW、cmake、make等本地工具。 2、下载YAML-cpp第三方开源代码(一定要下载最新的release版本,不然坑很多)。 3、生成YAML-cpp静态库 (1)在yaml-cpp-master下建立build文件夹; (2)在该文件夹下生成MakaFile文…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境:ubuntu22.04为刚刚安装,未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装: sudo apt install cmake sudo apt install gawk sudo apt instal…

C++ 程序员入门之路——旅程的起点与挑战

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

国庆假期day5

作业:请写出七层模型及每一层的功能,请绘制三次握手四次挥手的流程图 1.OSI七层模型: 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传…

国庆10.4

QT实现TCP服务器客户端 服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表容器 #include <QMe…

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…

Apacha Flume

0目录 1.Flume概述 2.Flume安装部署 3.案例1 4.案例2 5.案例3 1.Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础架构 Flume组…

ES6中对象的扩展

1. 属性的简洁表示法 可以直接写入变量和函数作为对象的属性和方法。在对象中只写属性名&#xff0c;不写属性值&#xff0c;代表属性值等于和属性名相同的的变量的值。 属性的简写 let foo bar; let baz {foo}; // { foo: bar } // 等同于 let baz { foo: foo}方法的简写…