2012-03-30 55 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聲明,沒有顯式事務命令,並且如果發生錯誤,數據庫引擎將回滾整個語句。