Mysql

我什麼時候需要事務/鎖?

  • April 8, 2014

我知道事務旨在將多個操作組合為一個。

但是,例如,如果在同一個表中,一個事務執行

DELETE FROM table where state = 'done'

而另一個事務執行,

SELECT FROM table where state='new_row'

或者INSERT INTO TABLE VALUES (123, 'new_row')

我是否需要 DELETE 與 INSERT/SELECT 的任何事務或鎖?似乎不是,但我在想我可能誤解了一些東西

注意:

我的問題不是關於事務及其好處。我的問題是來自同一表 SELECT/DELETE 上不同程序的 2 個語句是否需要同步

通常,在對數據庫執行查詢(SQL 語句)時,您希望所有語句都成功完成,並且如果它們沒有將數據恢復到執行 sql 語句之前的狀態。您正在尋找的整體概念是ACID

為了提供此功能,數據庫通常支持事務的概念。

當您使用事務啟動 SQL 語句時,您是在告訴數據庫事務中的所有語句都必須成功完成,如果沒有成功,數據庫將回滾(還原)您的更改,將數據庫恢復到您創建之前的狀態改變。

採取以下兩種說法:

Insert INTO UserName VALUES (123,'Test User')
Insert INTO UserCommission VALUES (123,0.5)

如果您在沒有事務的情況下執行上述語句並且第一條語句失敗,那麼第二條語句仍將執行,從而將一行插入到 UserCommission 表中,而在 UserName 表中沒有關聯的行。

如果您隨後執行以下命令

BEGIN TRANSACTION
Insert INTO UserName VALUES (123,'Test User')
Insert INTO UserCommission VALUES (123,0.5)
IF NO Errors Commit ELSE Rollback

在這種情況下,如果第一個語句失敗,您可以檢查錯誤,然後回滾事務(sql 語句)離開數據庫,就好像您從未執行過該語句一樣,因此您在 UserCmomission 表中不再有一行,而在使用者名表。

通常,您只需要在實際更改插入、刪除、更新等數據時進行事務處理,但有時作為過程的一部分,您可能需要選擇語句來獲取一些可能在插入、刪除、更新等語句中使用的數據。

另一個上的鎖處理了數據庫實際上如何在內部標記數據正在使用中,這樣如果其他使用者正在查詢相同的數據,數據庫就會知道數據正在使用中。

根據您的表的構造方式(鍵、索引等)、表的大小等以及您正在執行的操作類型(選擇、插入、更新、刪除),數據庫將執行許多不同類型的鎖,例如頁面、表,行鎖等

當然,所有這些都會影響查詢和/或數據庫的性能。

我不是 100% 確定我理解你的問題,但無論如何。通常不需要SELECT在事務中包裝語句,因為它們是只讀的,儘管您可以指定要SELECT使用的隔離級別(READ UNCOMITTED例如)。有關 MySQL 中語句導致的鎖以及如何更改讀取類型的問題,請參見此處。SELECT

DELETE並且INSERT會在它們必須工作時自動鎖定記錄,但您可能希望對它們進行事務處理以允許您在發生意外錯誤的情況下回滾,或者如果您有一系列事件,其中後面的語句依賴於前面的成功並且您不希望在失敗的情況下使數據處於不確定狀態。

引用自:https://dba.stackexchange.com/questions/62735