【问题标题】:Do i need transaction for joined query?我需要为连接查询进行交易吗?
【发布时间】:2012-03-30 07:48:41
【问题描述】:

在使用连接的 sql 查询期间,我需要使用事务吗?

我在想这样的事情:

Delete table1, table2, table3 
FROM table1 INNER JOIN table2 ON(...) 
LEFT JOIN table3 ON (...) 
WHERE table1.column = something...

(我不知道语法是否 100% 正确,但我想你还是明白了)

是否存在并非所有应该删除的行都没有被删除的风险?

谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我不认为使用事务会做任何事情,在大多数情况下,单个查询是原子的,它在单个事务中运行。对于 MS-SQL 服务器查询,如没有日志的批量插入和截断可能需要事务。在您的情况下,您不需要围绕您的删除语句进行交易。如果有多个语句,那么您需要将它们包装在一个事务中,以便执行全部或不执行 看看这个question

    【讨论】:

      【解决方案2】:

      由于这是单个命令 (DELETE),因此无需显式使用事务。 SQL 命令根据定义是原子的,即它要么删除所有符合条件的行,要么根本不删除,如果出现错误。

      编辑:这个答案在理论上是正确的,并且对于支持 ACID 的数据库。如果数据库不支持原子性,或者存在导致数据库引擎部分错误行为的错误,那么所有的赌注都将失败。但是,在这些情况下,使用事务不可能神奇地使它变得更好。

      【讨论】:

      • 这仅适用于影响 InnoDB 表的语句。删除例如MyISAM 表不是原子的,可能只会删除一半的表。
      • @a_horse_with_no_name - 同意,这仅适用于 ACID 表。但是,我没有使用 MyISAM 表的经验,所以我不确定事务在这种情况下是否有帮助。
      • @SWeko 在某些情况下,它不会回滚。无论如何,在 MySQL v5.1 中(参见:bugs.mysql.com/bug.php?id=45309
      【解决方案3】:

      不,您不需要交易。一个事务使多个语句作为一个单元运行;在事务内部或外部运行单个语句将始终产生相同的结果。

      回答你的最后一个问题,声明是全部或全部。我能想到的唯一可能的例外是,如果在语句中间发生了停电……而交易对此无济于事。

      【讨论】:

        【解决方案4】:

        对于任何INSERTUPDATESELECTDELETE语句,都没有明确的事务命令,如果发生错误,数据库引擎将回滚整个语句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-04
          • 1970-01-01
          • 2012-08-08
          • 1970-01-01
          • 2019-03-02
          • 2019-10-01
          • 1970-01-01
          相关资源
          最近更新 更多