在执行MySQL批处理语句时,这些语句是在一个批处理中还是在该批处理中逐行处理?
即如果我的批处理中有两个查询,服务器是否有可能从两个查询之间的不同连接中处理查询(因此可能会更改数据)?
一个例子:
connect.setAutoCommit(false);
statement.addBatch("INSERT INTO ArchivedEntries ("+fieldnames+") SELECT "+fieldnames+" FROM Entries WHERE IsOld IS NOT NULL");
statement.addBatch("DELETE FROM Entries WHERE IsOld IS NOT NULL");
statement.executeBatch();
connect.commit();
connect.setAutoCommit(true);
我有多个并发连接到服务器。是否有可能在这些调用之间潜入其他连接,并有可能在这两个调用之间更改条目表中的IsOld?这意味着它没有被存档,但是随后被删除。还是可以确定两个呼叫都被保证立即连续被呼叫?
答案 0 :(得分:0)
将它们一并处理
否。
或逐行
是的
这些呼叫之间是否有可能出现其他连接并可能更改IsOld
是的,有可能。但是您可以使用web.api
来防止这种情况。
答案 1 :(得分:0)
按照弗拉德米尔斯的回答调查了“交易”之后,我现在认为上面的原始代码实际上是安全的。
https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html
但是,它与批处理无关,而是“魔术”位于代码的自动提交部分。
基于上面的链接,我还要说的是,即使没有批处理,它也应该不会被拦截:
connect.setAutoCommit(false);
statement.executeUpdate("INSERT INTO ArchivedEntries ("+fieldnames+") SELECT "+fieldnames+" FROM Entries WHERE IsOld IS NOT NULL");
statement.executeUpdate("DELETE FROM Entries WHERE IsOld IS NOT NULL");
connect.commit();
connect.setAutoCommit(true);