1. 程式人生 > >SQLServer之資料庫行鎖

SQLServer之資料庫行鎖

行鎖使用注意事項

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 語句。

使用T-SQL指令碼建立資料庫表鎖

示例:

第一步:在當前會話中鎖定資料行。

--宣告資料庫引用
use testss;
go

--宣告資料庫行鎖
begin tran tran1
select * from test1 with(rowlock,updlock) where id='1';
waitfor delay '00:00:10';


commit tran;
go

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

update test1 set sex='女' where id='1';

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