我是否需要加入查询的交易?

Eas*_*der 3 mysql sql

在使用连接的SQL查询期间,我是否需要使用事务?

我在考虑这样的事情:

Delete table1, table2, table3 
FROM table1 INNER JOIN table2 ON(...) 
LEFT JOIN table3 ON (...) 
WHERE table1.column = something...
Run Code Online (Sandbox Code Playgroud)

(我不知道语法是否100%正确,但我想你无论如何都理解它)

是否存在不应删除所有行的风险?

谢谢!

Hab*_*bib 5

我不认为使用事务会做任何事情,在大多数情况下,单个查询是原子的,并且它在单个事务中运行.对于MS-SQL服务器查询,如没有日志和截断的批量插入可能需要事务.在您的情况下,您不需要在删除语句周围进行转换.如果有多个语句,那么您需要将它们包装在一个事务中,以便执行所有或不执行任何操作查看此问题


SWe*_*eko 5

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

编辑:这个答案在理论上是正确的,对于支持 ACID 的数据库来说也是如此。如果数据库不支持原子性,或者存在会触发数据库引擎部分错误行为的错误,那么所有的赌注都会失败。然而,在这些场景中使用事务不太可能神奇地使其变得更好。

  • 这只适用于影响 InnoDB 表的语句。针对例如 MyISAM 表的删除**不是**原子的,并且可能只删除一半的表。 (2认同)

Bra*_*ore 5

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

为了回答你的最后一个问题,这个声明要么全有,要么全无。我能想到的唯一可能的例外是,如果语句中间发生断电……而交易无济于事。