SQL使用行鎖


行鎖使用需要注意

1、ROWLOCK行級鎖確保在用戶取得被更新的行,到該行進行更新,這段時間內不被其它用戶所修改。因而行級鎖即可保證數據的一致性,又能提高數據操作的並發性。

2、ROWLOCK告訴SQL Server只使用行級鎖,ROWLOCK語法可以使用在SELECT,UPDATE和DELETE語句中。

3、ROWLOCK指定通常采用頁鎖或表鎖時,采用行鎖。 在從 SNAPSHOT 隔離級別操作的事務中指定時,除非將 ROWLOCK 與需要鎖的其他表提示(例如,UPDLOCK 和 HOLDLOCK)組合,否則不會取得行鎖。

4、UPDLOCK指定采用更新鎖並保持到事務完成。UPDLOCK 僅對行級別或頁級別的讀操作采用更新鎖。 如果將 UPDLOCK 與 TABLOCK 組合使用或出於一些其他原因采用表級鎖,將采用排他 (X) 鎖。指定 UPDLOCK 時,忽略 READCOMMITTED 和 READCOMMITTEDLOCK 隔離級別提示。 例如,如果將會話的隔離級別設置為 SERIALIZABLE 且查詢指定 (UPDLOCK, READCOMMITTED),則忽略 READCOMMITTED 提示且使用 SERIALIZABLE 隔離級別運行事務。

5、HOLDLOCK等同於SERIALIZABLE。HOLDLOCK 僅應用於那些為其指定了 HOLDLOCK 的表或視圖,並且僅在使用了 HOLDLOCK 的語句定義的事務的持續時間內應用。 HOLDLOCK 不能被用於包含 FOR BROWSE 選項的 SELECT 語句。

第一步:在當前會話中鎖定數據行。

--聲明數據庫引用
use test;
go

--聲明數據庫行鎖
begin tran tran1
select * from MPHead with(rowlock,updlock) where id=1;
waitfor delay '00:00:10';
commit tran;
go

第二步:開啟新會話,進行更新鎖定數據行。

update MPHead set EditBy='demo1' where id=1;

示例結果:事務延遲提交十秒,在事務未提交之前進行更新會發生進程阻塞,更新是失敗的,事務提交完成后行鎖被釋放更新才能成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM