Skip to content

JDBC(Java Database Connectivity)提供了对事务的支持,您可以使用它来执行具有原子性、一致性、隔离性和持久性特征的数据库操作。

以下是一个示例代码,演示如何在 JDBC 中执行事务:

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

public class JdbcTransactionExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;

        try {
            // 连接到数据库
            conn = DriverManager.getConnection(url, username, password);

            // 关闭自动提交,开启事务
            conn.setAutoCommit(false);

            // 执行第一个更新操作
            String sql1 = "UPDATE mytable SET column1 = ? WHERE id = ?";
            pstmt1 = conn.prepareStatement(sql1);
            pstmt1.setString(1, "value1");
            pstmt1.setInt(2, 1);
            int rowsAffected1 = pstmt1.executeUpdate();

            // 执行第二个更新操作
            String sql2 = "UPDATE mytable SET column2 = ? WHERE id = ?";
            pstmt2 = conn.prepareStatement(sql2);
            pstmt2.setString(1, "value2");
            pstmt2.setInt(2, 2);
            int rowsAffected2 = pstmt2.executeUpdate();

            // 提交事务
            conn.commit();

            System.out.println("事务执行成功!");
        } catch (SQLException e) {
            // 发生异常时回滚事务
            try {
                if (conn != null) {
                    conn.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (pstmt1 != null) {
                    pstmt1.close();
                }
                if (pstmt2 != null) {
                    pstmt2.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在上面的代码中,我们首先连接到数据库,并将自动提交设置为 false,以开启事务。然后执行两个更新操作,在每个操作之后检查受影响的行数。最后,如果没有发生异常,则提交事务;否则,回滚事务。

请注意,在使用事务时,您需要确保您的数据库引擎支持事务,并且您的表格是使用支持事务的存储引擎创建的(例如 InnoDB 引擎)。