Postgresql解決多線程高併發情況下的安全問題

問題描述:


  現在有一個需求,數據庫表中有一個值,我需要查詢出來,修改這個值之後再存回數據庫。


  下一個請求來到,查詢出剛剛的新值,修改之後保存。


  循環往復。。。


  假設是多線程請求,那麼第一個請求來到,獲取值,在修改保存到數據庫之前。第二個請求也來獲取值。這時兩個請求拿到的是同一份值,然後第一個請求保存,接着第二個請求保存。這種情況下如果每個請求修改值的邏輯相同,第一個請求保存的值將會被第二個請求覆蓋。


  即上面兩個請求只做了一件事。因爲第一個請求已經把事情做了,按照我們的想法,第二個請求應該拿着第一件事的結果去做下一件事。但是第二個請求仍然做的第一件事。出現了我們預料之外的情況。

  我根據Postgresql的事務的機制對這種情況進行了解決。

  首先,我們要理解鎖的概念。第一個請求拿到值,修改保存之前絕對不能讓別的請求也拿到這個值。也就是在某個請求拿到值時要對該數據進行加鎖。修改保存之後將鎖放開。


  其次,爲什麼需要使用到事務,是因爲鎖是基於事務實現的,鎖只能在事務中使用。事務提交或者回滾時,鎖被自動釋放。

  上面簡單介紹了一些理論,接下來實踐一下。

查詢語句:

--開啓事務
begin;   
--鎖表,鎖定表之後只有當前事務可以操作。具體鎖表還是鎖行視業務而定
LOCK TABLE count IN ACCESS EXCLUSIVE MODE; 
--查詢
select * from disorder_count limit 1 ; 
        

修改語句:

--更新數據
update count set count = ?1 ;
--提交事務
commit ;

  執行完查詢語句之後,直到當前事務出現commit獲取rollback,鎖纔會釋放,當前事務纔會停止。

  若心存疑惑,可自行研究postgresql事務相關內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章