在使用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...