我必须在交易中放置PreparedStatament的地方

时间:2018-07-25 08:45:50

标签: java jdbc transactions prepared-statement

假设我要保存删除两个不同表中的两个元素,因此必须创建事务。我的问题是必须将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的第二种方法是事务处理。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

语句对象可以共享,也可以缓存。因此,您提供的代码没有问题。只要确保将它们放在try catch块中即可,所以如果不成功,它将被回滚。

与您一样,如果交易失败,则会回退固定交易。嵌套事务是从一个点提交到另一点的,因此只能部分回滚。您可以使用第二段代码。无需使事务可序列化,请尝试根据时间戳进行锁定,具体取决于您是进行读取还是写入以及您的要求。

答案 1 :(得分:0)

在一致的JDBC实现中,您可以使用以下任何一种顺序:准备好的语句的生存期比事务长,并且在事务提交后应该可以重用。

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