2009-08-30 126 views
0

我正在開發個人PHP/MySQL應用程序,並且在我的項目中遇到了這種特殊情況:我應該使用InnoDB嗎?

我有各種評論主題。這由兩個表格處理 - '評論'和'線索','評論'表中的每個評論具有'thread_id'屬性,用於指示評論屬於哪個線索。當用戶刪除評論跟帖,目前我做的兩個單獨的DELETE SQL查詢:

  1. 首先刪除所有屬於該線程的評論在「評論」表
  2. 然後,在清除從線程記錄'線程'表。

我也有另一種情況,在那裏我需要從一個表單數據插入到兩個獨立的表。

我應該在這些情況下使用交易嗎?如果是這樣,當我需要執行這樣的多個SQL查詢時,使用事務是否是一個通用的經驗法則?

回答

1

這取決於您的實際需求,事務只是一種確保所有形成單個事務的數據操作成功執行並且事務順序發生的方式(只有前一個事務成功完成後才能創建新事務或失敗)。如果其中一個查詢由於任何原因而失敗,則整個事務將失敗並且以前的狀態將被恢復。

如果您絕對需要確保沒有線程將被刪除,除非事先已刪除所有註釋,請進行交易。如果你需要所有速度你可以得到,去MyISAM

0

是的,在進行多個相關的操作時,使用事務處理是一般的經驗法則。如果你切換到InnoDB(通常是一個好主意,但並非總是如此,除了交易之外我們沒有討論任何其他需求,所以我不會再發表評論),我還建議對指向線程的評論設置約束因爲它聽起來像一個評論必須分配給一個線程。然後刪除線程將刪除單個原子語句中的相關注釋。

0

如果你想要ACID交易,你想要InnoDB。如果有一個DELETE成功,另一個失敗則意味着必須手動刪除失敗的嘗試,但我認爲這是一個更好的處理數據庫的困難。這些情況需要交易。

0

對於你的問題的第一部分,我會建議在你的評論表中聲明thread_id作爲外鍵。這應該引用線程表的id列。然後可以設置'ON DELETE CASCADE',這意味着當從線程表中刪除ID時,所有引用該ID的註釋也將被刪除。