MySQL Batch语句是否在一个块中执行

时间:2018-10-08 08:47:00

标签: mysql

在执行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?这意味着它没有被存档,但是随后被删除。还是可以确定两个呼叫都被保证立即连续被呼叫?

2 个答案:

答案 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);