Java如何在JDBC中提交或回滚事务?

由于无效数据,有时执行诸如插入,更新或删除之类的数据库操作命令可能会引发异常。为了保护我们的应用程序数据的完整性,我们必须确保在事务失败时必须回退所有已执行的命令,以便它影响数据的状态。

在此示例中,我们使用MySQL数据库。要在MySQL中启用事务处理功能,请确保您使用的是InnoDB存储引擎来创建表。

package org.nhooo.example.jdbc;

import java.sql.*;

public class TransactionRollbackExample {
    private static final String URL = "jdbc:mysql://localhost/nhooo";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "";

    public static void main(String[] args) throws Exception {
        try (Connection conn =
                 DriverManager.getConnection(URL, USERNAME, PASSWORD)) {
            conn.setAutoCommit(false);

            String query = "INSERT INTO orders (username, order_date) " +
                "VALUES (?, ?)";
            try (PreparedStatement stmt = conn.prepareStatement(query,
                PreparedStatement.RETURN_GENERATED_KEYS)) {
                stmt.setString(1, "javaduke");
                stmt.setDate(2, new Date(System.currentTimeMillis()));
                stmt.execute();

                ResultSet keys = stmt.getGeneratedKeys();
                int orderId = 1;
                if (keys.next()) {
                    orderId = keys.getInt(1);
                }

                // 这是一条无效的语句,将导致
                // 演示回滚。
                query = "INSERT INTO order_details (order_id, product_id, " +
                    "quantity, price) VALUES (?, ?, ?, ?, ?)";
                PreparedStatement detailStmt = conn.prepareStatement(query);
                detailStmt.setInt(1, orderId);
                detailStmt.setInt(2, 1);
                detailStmt.setInt(3, 10);
                detailStmt.setDouble(4, 29.99);
                detailStmt.execute();

                // 提交事务以将其标记为成功数据库操作
                conn.commit();
                System.out.println("Transaction commit...");
            } catch (SQLException e) {
                // 由于发生异常而回滚任何数据库事务
                conn.rollback();
                System.out.println("Transaction rollback...");
                e.printStackTrace();
            }
        }
    }
}

Maven依赖

<!-- https://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

Maven中央