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 引擎)。