表鎖tablock是會給表所有數據附加共享鎖,但是只是當前語句有效,語句執行完畢,鎖釋放,而不會持續到事務結束,而tablockX表鎖是持續到事務結束的鎖
holdlock鎖,鎖定的范圍會根據where條件后是否是聚集索引來改變的
例如
begin tran select * from t1 with(holdlock)where id= 29waitfor delay '00:00:05' commit
where條件的id是聚集索引,所以該語句只會給id為29的數據附加共享鎖,其他數據則不會,其他事務可以對id不等于29的其他數據進行update和delete操作
如果換成
begin tran select * from t1 with(holdlock)where colA= '29'waitfor delay '00:00:05' commit
where條件的colA不是聚集索引,該查詢會導致表掃描,所以會給整個表數據附加共享鎖,并且持續到事務結束,其他事務只能讀該表數據而不能進行其他操作
以上結論在sqlserver2008測試的
新聞熱點
疑難解答