MySQL是最流行的關系型數據庫之一,它提供了各種存儲引擎來滿足不同的需求。其中,InnoDB是MySQL默認的事務性存儲引擎。
在InnoDB中,讀操作默認使用共享鎖(S鎖),寫操作則使用排他鎖(X鎖)。而且讀操作也可以使用排他鎖,這可以通過在SELECT語句后添加FOR UPDATE來實現:
SELECT * FROM table_name WHERE conditions FOR UPDATE;
這種方式會在讀取數據時給行加上排他鎖,確保在事務提交之前,這些行不會被其他事務進行修改。
而當多個事務同時讀取同一行數據時,如果其中一個事務占用了排他鎖,那么其他事務也必須等到該事務釋放鎖才能進行讀操作。
以下是一個示例,展示了當一個事務使用排他鎖時,其他讀操作會被阻塞:
BEGIN; SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 其他讀操作會在此處阻塞,直到該事務釋放鎖 COMMIT;
它會在事務開始時使用SELECT語句獲取鎖,期間其他當前事務都必須等到鎖釋放才能讀取操作紀錄:
BEGIN; SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE; -- 其他讀操作也會被阻塞,直到該事務釋放鎖 COMMIT;
為了避免一些潛在的問題,建議僅在必要且必須的情況下使用FOR UPDATE和LOCK IN SHARE MODE。在大多數情況下,共享鎖足以滿足需求。