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

news2024/12/23 19:14:04

在这里插入图片描述

在数据库操作中,事务是一个非常重要的概念。事务可以确保一系列的数据库操作要么全部成功执行,要么全部失败回滚,以保持数据库的一致性和完整性。在 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_SERIALIZABLE
            connection.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.coloradmin.cn/o/1060378.html

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

相关文章

【Java 进阶篇】JDBC 数据库连接池详解

数据库连接池是数据库连接的管理和复用工具,它可以有效地降低数据库连接和断开连接的开销,提高了数据库访问的性能和效率。在 Java 中,JDBC 数据库连接池是一个常见的实现方式,本文将详细介绍 JDBC 数据库连接池的使用和原理。 1…

vs2015 函数声明、定义与引用

10.VS-函数声明、定义和引用 - 简书 简言之,函数先在头文件中被声明,然后在对应cpp文件中实现(定义),最后被不同文件的代码调用(引用)。

集合原理简记

HashMap 无论在构造函数是否指定数组长度&#xff0c;进行的都是延迟初始化 构造函数作用&#xff1a; 阈值&#xff1a;threshold&#xff0c;每次<<1 &#xff0c;数组长度 负载因子 无参构造&#xff1a;设置默认的负载因子 有参&#xff1a;可以指定初始容量或…

ES6中对象的扩展

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

力扣 -- 377. 组合总和 Ⅳ

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {int nnums.size();vector<double> dp(target1);//初始化dp[0]1;//填表for(int i1;i<target;i){for(int j0;j<n;j){//填表if(…

Windows下启动freeRDP并自适应远端桌面大小

几个二进制文件 xfreerdp # Linux下的&#xff0c;an X11 Remote Desktop Protocol (RDP) client which is part of the FreeRDP project wfreerdp.exe # Windows下的&#xff0c;freerdp2.0 主程序&#xff0c;freerdp3.0将废弃 sdl-freerdp.exe # Windows下的&…

Linux系统及Docker安装RabbitMq

目录 一、linux系统安装 1、上传文件 2、在线安装依赖环境 3、安装Erlang 4、安装RabbitMQ 5、开启管理界面及配置 6、启动 7、删除mq 二、docker安装 1、上传mq.tar包或使用命令拉取镜像 2、启动并运行 3、访问mq 一、linux系统安装 1、上传文件 2、在线安装依赖环…

B2主题优化:WordPress文章每次访问随机增加访问量

老站长都知道&#xff0c;一个新站刚开始创建&#xff0c;内容也不多的时候&#xff0c;用户进来看到文章浏览量要么是0&#xff0c;要么是 个位数&#xff0c;非常影响体验&#xff0c;就会有一种“这个网站没人气&#xff0c;看来不行”的感觉。 即使你的内容做的很好&#x…

5.Vectors Transformation Rules

在上节&#xff0c;有个问题&#xff1a;向量分量的转换方式 与 新旧基底的转换方式相反 用例子来感受一下&#xff0c; 空间中一向量V&#xff0c;即该空间的一个基底&#xff1a;e1、e2 v e1 e2 现把基底 e1 、 e2 放大两倍。变成 基向量放大了两倍&#xff0c; 但对于…

Day-05 CentOS7.5 安装docker

参考 &#xff1a; Install Docker Engine on CentOS | Docker DocsLearn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/install/centos/ Doc…

「专题速递」RTC云网端联合优化、弱网对抗策略、QUIC协议的能力和实践

随着互联网日益增长的加速需求、复杂的网络环境和多样化的视频业务&#xff0c;音视频技术领域的专家们正在不断探索如何实现准确和极低延迟的网络传输能力。他们在应用层流控、传输层协议设计以及跨层优化等方面积极努力&#xff0c;以改善用户的网络体验。 在当今数字化时代&…

Spacewalk

Spacewalk Spacewalk是一种开源的系统管理工具&#xff0c;提供了集中管理多个Linux服务器的功能。以下是一些Spacewalk用例&#xff1a; Spacewalk是基于Substrate的parachains和Stellar之间的桥梁&#xff0c;可以实现与Stellar的资产转移。该拨款申请用于开发太空行走协议…

Java 基于 SpringBoot 的学生考勤系统

1 简介 本文讲解的是 Java基于 SpringBoot 的学生考勤系统。学生考勤管理系统能做到的不仅是大大简化管理员的信息管理工作&#xff0c;在提高学生考勤管理效率的同时还能缩减开支&#xff0c;更能在数字化的平面网络上将学生考勤管理最好的一面展示给客户和潜在客户&#xff…

MyBatisCodeHelper Pro3.x新版本插件自由

1效果图 我的版本为3.2.2 2.资源链接 码云地址点这里 3.使用说明 将我修改好后的MyBatisCodeHelper-Pro-obfuss.jar替换MybatisCodeHelperNew-3.x.x.zip&#xff08;原版本插件&#xff09;\MyBatisCodeHelper-Pro\lib中的MyBatisCodeHelper-Pro-obfuss.jar 4.实现与感谢…

腾讯云南京服务器性能如何?南京服务器测速IP地址

腾讯云服务器南京地域怎么样&#xff1f;南京地域很不错&#xff0c;正好处于中间的位置&#xff0c;南方北方用户均可以选择&#xff0c;网络延迟更低速度更快&#xff0c;并且目前南京地域有活动&#xff0c;南京地域可用区可选南京一区、南京二区和南京三区&#xff0c;腾讯…

c语言实现玫瑰花

浅浅跟波风 1.效果图 2.代码实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h>const int max_iterations 128; const float stop_threshold 0.01f; const float grad_step 0.01f; const float clip_far 10.0f;const float PI 3.1…

录屏软件——Vizard

Vizard&#xff0c;美且实用的网页端录屏软件&#xff0c;轻巧不占内存。Windows/Mac OS均适用。 可以录电脑操作、录软件教程、录网课、录bug、录工作汇报、录创作素材&#xff08;游戏&#xff09;……几乎能想到的一切录屏场景。 除了完全免费的在线录屏&#xff0c;Vizar…

腾讯云服务器选购指南:如何选择一台合适的云服务器配置?

腾讯云服务器配置如何选择&#xff1f;CPU内存、带宽和系统盘怎么选择合适&#xff1f;个人用户可以选择轻量应用服务器&#xff0c;企业用户可以选择云服务器CVM&#xff0c;2核2G3M带宽轻量服务器95元一年、2核4G5M服务器168元一年&#xff0c;企业用户可以选择标准型S5云服务…

GPT系列论文解读:GPT-1

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

计算数组中全部元素的乘积 忽略数组中所有的NaN值 numpy.nanprod()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算数组中全部元素的乘积 忽略数组中所有的NaN值 numpy.nanprod() [太阳]选择题 请问代码中最后输出正确的是&#xff1f; import numpy as np a np.array([2, 3, np.nan, 5]) print(&quo…