2012-03-30 65 views
3

在使用连接进行sql查询期间,我是否需要使用事务?我是否需要加入查询的交易?

我在想是这样的:

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

(我不知道如果语法是100%正确的,但我猜你了解也无妨)

不会有风险,并非所有的应该删除的行不会被删除?

谢谢!

回答

4

因为这是一个命令(DELETE)没有必要明确地使用事务。 SQL命令按定义是原子的,即它将删除所有符合条件的行,或者根本不删除所有符合条件的行。

编辑:这个答案在理论上是正确的,并且支持ACID的数据库。如果数据库不支持原子性,或者存在触发数据库引擎不正确行为的错误,则所有投注都将关闭。但是,使用交易不可能在这些情况下神奇地变得更好。

+2

这只适用于影响InnoDB表的语句。删除例如MyISAM表是**不是**原子的,可能只能删除一半表。 – 2012-03-30 07:59:08

+0

@a_horse_with_no_name - 同意,这只适用于ACID表。但是,我没有使用MyISAM表的经验,所以我不确定在这种情况下交易是否会有所帮助。 – SWeko 2012-03-30 08:04:01

+0

@Sekek在某些情况下,它不会回滚。无论如何,在MySQL v5.1中(请参阅:http://bugs.mysql.com/bug.php?id=45309) – mattytommo 2012-03-30 08:06:56

5

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

4

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

并回答你最后的问题,该声明是全部或没有。我能想到的唯一可能的例外情况是,如果在声明的中间发生停电事故,而交易无助于此。

1

对于任何INSERT,UPDATE,SELECT,DELETE声明,没有显式事务命令,并且如果发生错误,数据库引擎将回滚整个语句。