我必须将 PreparedStatament 放在事务中的位置

Where I must put PreparedStatament in a transaction

假设我想在两个不同的 table 中保存删除两个元素,所以我必须创建事务。我的问题是我必须在哪里放置 PreparedStatement 元素?我必须这样输入(我的意思是在交易中)

connection_database.setAutoCommit(false);
connection_database.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
PreparedStatement p1.......
PreparedStatement p2;
p1.execute();
p2.execute();
connessione_db.commit();
connessione_db.setAutoCommit(true);

或者我可以这样说吗?

PreparedStatement p1.......
PreparedStatement p2;
connection_database.setAutoCommit(false);
connection_database.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

p1.execute();
p2.execute();
connessione_db.commit();
connessione_db.setAutoCommit(true);
  1. 创建 PreparedStatement 的第一种方法是在事务中
  2. 创建 PreparedStatement 的第二种方法是在交易之外。

谁能帮帮我?

语句对象可以共享,也可以缓存。所以你提供的代码没有问题。只需确保将它们放入 try catch 块中,这样如果不成功,它将被回滚。

如果像您一样不成功,则平交易将被回滚。嵌套事务从一点提交到另一点,因此只能部分回滚。您可以使用第二段代码。无需使事务可序列化,根据您是读还是写以及您的要求,尝试基于时间戳进行锁定。

在符合规范的 JDBC 实现中,您可以使用任一顺序:准备好的语句的生命周期比事务长,并且在事务提交后应该可以重用。

但是,根据驱动程序和数据库系统,在准备语句之前先禁用自动提交可能会更有效。这可能取决于驱动程序在准备语句时是否需要事务。如果驱动程序在准备时需要事务,那么在准备后禁用自动提交可能会在准备这两个语句的过程中启动(并提交)一个或两个事务,但如果您在禁用自动提交后准备它们,则准备可以使用与随后用于实际执行相同的事务。