1. 程式人生 > >在mysql 中兩種鎖定問題

在mysql 中兩種鎖定問題

讀取 mode 可見 刪除 mit 信息 獨占鎖 rom 事務

mysql 中15.2.10.5 中描述了兩個問題,且分別給出了解決辦法。
1.向子表中寫入數據,但寫入之前需確保父表中存在其相應信息。
可能出現,在已經讀取父表中的數據,但另一請求將其刪除。
辦法:

begin;
select info from father_table where name = ‘nike‘ LOCK IN SHARE MODE;
insert into son_table values(‘SomeInfo‘);
commit;

事務是確保多個進程的原子性, 但不能保證上述問題的正確性。在事務中,使用了LOCK IN SHARE MODE,
它在我們讀取的行設置一個共享鎖,這樣就可讀取最新數據了,同時,訪問了一個同樣有共享鎖定的數據時,
則會等待該事務提交,之後再進行讀取。這樣就避免了一個事務未完成時,數據卻被修改的問題。

2.實現一個計數器時,對同一字段進行修改,當兩用戶同時對其讀取再修改時, 一個進程可能在
另一進程讀數據和再次寫數據中讀取數據的情況,這樣,就會遺漏一次統計。
辦法:
1 . 先寫數據,寫數據加鎖,且讀數據也被限制,只有等數據加完,才能讀取,而加完後,則是最新的數據。
2 .

begin;
select count form son_table FOR UPDATE;
update son_table set count = count + 1;
commit;

SELECT ... FOR UPDATE讀最新的可見數據,在每個它讀取的行設置獨占鎖定。因此,它設置與搜索的SQL UPDATE可能會在行上設置的鎖定同樣的鎖定。

通過上面的例子則可以發現,當多個用戶對同一行數據進行訪問時,則可能出現鎖,反之,單一用戶訪問只屬於他自己的數據,則不太可能出現鎖定,如,修改個人資料

在mysql 中兩種鎖定問題