使用Sqlserver更新鎖防止資料髒讀

2022-07-12 07:12:11 字數 1210 閱讀 7407

有時候我們需要控制某條記錄在程式讀取後就不再進行更新,直到事務執行完釋放後才可以。這時候我們就可以將所有要操作當前記錄的查詢加上更新鎖,以防止查詢後被其它事務修改。這種操作只鎖定表中某行而不會鎖定整個表,體驗更好。

測試sql**如下:

在乙個查詢中執行如下語句

begin tran

select investstate from investordersabc with (updlock)

where id=10005

waitfor delay

'00:00:10

'update investordersabc

set investstate='2'

where id=10005

commit tran

1、在另外的乙個查詢中執行以下語句

select investstate from investordersabc  where id=10005

發現在第乙個事務執行完以前查到的數值還是原來的數值0,直到更新完成後才會變成2,如果加上鎖,**如下:

select investstate from investordersabc with (updlock) where id=10005

發現sql語句必須等到第乙個連線裡的事務完成才執行完成,這是因為這個sql的連線的更新鎖認為第乙個事務裡的更新鎖可能會對資料進行修改,因此必須等事務執行完成才執行。此時更新鎖變為排他鎖。

2、如果執行更新操作:

begin tran

update investorders

set investstate='3'

where id=10005

commit tran

發現無法更改,只能等到第乙個查詢完成後才會進行修改。其實和加鎖不加鎖已經沒什麼關係,為什麼呢?因為sql server在執行insert、 update 或delete 命令時,會自動使用獨佔鎖。

3、上文的事務未加隔離級別,事務的預設隔離級別為read  committed,不加鎖因此在第1點裡還可以進行查詢。當資料庫事務的隔離級別為repeatable read,serializable時,如果查詢需要加共享鎖:

select investstate from investordersabc with (holdlock) where id=10005

SqlServer的更新鎖 UPDLOCK

updlock.updlock 的優點是允許您讀取資料 不阻塞其它事務 並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。當我們用updlock來讀取記錄時可以對取到的記錄加上更新鎖,從而加上鎖的記錄在其它的執行緒中是不能更改的只能等本執行緒的事務結束後才能更改,我如下示例 begin t...

SqlServer的更新鎖 UPDLOCK

updlock 讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。updlock 的優點是允許您讀取資料 不阻塞其它事務 並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。這是sqlserver2000中對更新鎖的說明.當我們用updlock來讀取記錄時可以對取到的記錄...

SqlServer的更新鎖(UPDLOCK)

updlock 讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。updlock 的優點是允許您讀取資料 不阻塞其它事務 並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。這是sqlserver2000中對更新鎖的說明.當我們用updlock來讀取記錄時可以對取到的記錄...