MYSQL select時鎖定記錄問題

2021-06-17 20:52:57 字數 1907 閱讀 6008

在使用sql時,大都會遇到這樣的問題,你update一條記錄時,需要通過select來檢索出其值或條件,然後在通過這個值來執行修改操作。

但當以上操作放到多執行緒中併發處理時會出現問題:

某執行緒select

了一條記錄但還沒來得及

update

時,另乙個執行緒仍然可能會進來

select

到同一條記錄。

一般解決辦法就是使用鎖和事物的聯合機制:

如:1.

把select

放在事務中,否則

select完成,

鎖就釋放了。2.

要阻止另乙個

select,

則要手工加鎖

, select

預設是共享鎖, select

之間的共享鎖是不衝突的,所以

,如果只是共享鎖

,即使鎖沒有釋放

,另乙個

select

一樣可以下共享鎖,從而

select

出資料。

begin tran

select * from table with(tablockx)

或者 select* from table with(updlock, readpast) 具體情況而定。

update ....

commit tran

鎖描述:

holdlock

:將共享鎖保留到事務完成,而不是在相應的表、行或資料頁不再需要時就立即釋放鎖。

holdlock

等同於serializable

。nolock

不要發出共享鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生髒讀。僅應用於

select

語句。paglock

:在通常使用單個表鎖的地方採用頁鎖。

readcommitted

:用與執行在提交讀隔離級別的事務相同的鎖語義執行掃瞄。預設情況下,

sql server 2000

在此隔離級別上操作。

readpast

:跳過鎖定行。此選項導致事務跳過由其它事務鎖定的行(這些行平常會顯示在結果集內),而不是阻塞該事務,使其等待其它事務釋放在這些行上的鎖。

readpast

鎖提示僅適用於執行在提交讀隔離級別的事務,並且只在行級鎖之後讀取。僅適用於

select

語句。readuncommitted

:等同於

nolock

。repeatableread

:用與執行在可重複讀隔離級別的事務相同的鎖語義執行掃瞄。

rowlock

:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。

serializable

:用與執行在可序列讀隔離級別的事務相同的鎖語義執行掃瞄。等同於

holdlock

。tablock

:使用表鎖代替粒度更細的行級鎖或頁級鎖。在語句結束前,

sql server

一直持有該鎖。但是,如果同時指定

holdlock

,那麼在事務結束之前,鎖將被一直持有。

tablockx

使用表的排它鎖。該鎖可以防止其它事務讀取或更新表,並在語句或事務結束前一直持有。

updlock

:讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。

updlock

:的優點是允許您讀取資料(不阻塞其它事務)並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。

xlock

:使用排它鎖並一直保持到由語句處理的所有資料上的事務結束時。可以使用

paglock

或tablock

指定該鎖,這種情況下排它鎖適用於適當級別的粒度。

ABAP 資料庫操作時的鎖定問題

要支援更新 繫結計畫,sap 系統提供了 完全不同於 資料庫鎖定 的鎖定機制 sap 鎖定的優點 在於可以在 多重螢幕間 保留它們,如同更新事務 頁 所需要的。資料庫鎖定 是資料庫系 統中的物理 鎖定。在程 序中使用更 新語句 select single for update insert upda...

彙總明細時一定要先鎖定明細

部分對賬檔案的明細彙總金額比實際要少。在明細彙總和更新彙總狀態為 已處理 之間存在幾毫秒的時間差。在時間差內又入庫了多條明細,並且狀態由 待處理 更新為 已處理 但是這部分明細並沒有參與明細彙總,因此被遺漏了。彙總處理sql簡略如下 00是待處理,01是已處理 select sum amount f...

SVN問題解決 專案更新時,出現鎖定

1 專案更新時,出現鎖定 attempted to lock an already locked dir svn commit failed details follow svn working copy e eclipse2018workspace2 sws src com sws www loc...