0

我有以下查询

  1. 从 WHERE Id IN 中删除(从 B 中选择 Id)
  2. 从 B 中删除

我想确保第一条语句在第二条语句执行之前完成,因为 1) 依赖于 2)

我想知道我是否像这样执行这些查询,SQL 是否会在开始第二个事务之前完成第一个事务?或者有没有一种方法可以确保第二个事务仅在第一个事务完成后才开始?

任何帮助,将不胜感激

4

4 回答 4

1

如果语句在同一批次中,则可以保证。

但是您可能希望将它们包装在事务中以确保两者都发生或都不发生(回滚)。

于 2013-11-12T23:17:42.830 回答
1

您可以通过用分号分隔查询来连续执行查询;。更多细节在MySQL 文档中。

只需这样做:

DELETE FROM A WHERE Id IN (SELECT Id FROM B); DELETE FROM B;

根据您的要求;根据以下示例,这完全符合您的要求:

mysql> select sleep(5); show databases;
+----------+
| sleep(5) |
+----------+
|        0 |
+----------+
1 row in set (5.00 sec)

+--------------------+
| Database           |
+--------------------+
|         ...        |
+--------------------+
9 rows in set (0.01 sec)

您可以使用mysql -e命令和几乎任何 mysql 库(例如带有 php 的库)来执行此操作。

于 2013-11-12T23:19:39.550 回答
1

为了回答您的问题,MySQL 在给定会话中一次只执行一条语句。所以第二个语句不可能在第一个语句完成之前开始(假设你在同一个线程中执行它们)。

我将提供另一种选择:在一个语句中从两个表中使用多表 DELETE 怎么样?

DELETE A, B FROM A RIGHT OUTER JOIN B USING (id);

我上面使用的连接类型意味着将删除 B 中的所有行,以及 A 中具有匹配 id 值的行(如果有)。

于 2013-11-12T23:26:06.450 回答
1

您可以将删除语句放在事务/尝试捕获块中。如果一个删除语句遇到错误,您可以将数据库的状态“回滚”到事务开始之前。这是一个例子。

BEGIN TRY
BEGIN TRANSACTION
    --Your sequence of SQL statements here
END TRY
BEGIN CATCH
        ROLLBACK TRANSACTION
END CATCH
于 2013-11-12T23:31:00.747 回答