• 【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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在上述代码中,我们通过 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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在上述代码中,我们通过 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
  • 相关阅读:
    论文翻译解读:Logmap:Logic-based and scalable ontology matching
    Python网络爬虫(一):HTML/CSS/JavaScript介绍
    PythonStudy6
    Ribbon
    企业级WordPress开发 – 创建企业级网站的优秀提示
    c++调用Lua(table嵌套写法)
    Python实现从Labelme数据集中挑选出含有指定类别的数据集
    装修知识总结
    新学期 新气象
    ELK【elasticsearch+logstash+kibana】企业级日志分析系统
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/133563151