1.排它鎖
在一個Sql串連中這樣寫:
begin tran
--select * from a with(UPDLOCK)
update a set [name]='wq' where [id]=2 --這裡的set的值不能不變(即不能本來name='wq'又set name='wq'),否則Sql Server會最佳化
成不加鎖
waitfor delay '00:00:08'
commit tran
在另外一個sql串連中這樣寫:
select * from a
發現第二個串連裡的sql語句必須等到第一個串連裡的事務完成才執行完成,這是因為第一個串連裡的update語句自動加了獨佔鎖
2.Sql Server 預設鎖
即INSERT、 UPDATE 或DELETE 命令時,SQL Server 會自動使用獨佔鎖。
Select語句:1.當事務的隔離等級為 READ committed,READ uncommitted 時為不加鎖,既unlock
2.當事務的隔離等級為 REPEATABLE READ,SERIALIZABLE時,為共用鎖定,既HoldLock
3.交易隔離等級:
1.REPEATABLE READ
在第一個Sql串連的一個事務中這樣設定以後,那麼在第二個Sql串連裡,不能對第一個串連裡事務操作的表進行update,delete操作,但是能進行
insert操作,且新插入的行包括在第一個串連的當前事務的後續讀取中
2.SERIALIZABLE
在資料集上放置一個範圍鎖,以防止其他使用者在事務完成之前更新資料集或將行插入資料集內。這是四個隔離等級中限制最大的層級。因為並發層級
較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設定 HOLDLOCK 相同。即在第一個Sql串連的一個事
務中這樣設定以後,那麼在第二個Sql串連裡,不能對第一個串連裡事務操作的表進行update,delete,insert操作
4.關於更新鎖定
在一個Sql串連中這樣寫:
begin tran
begin tran
select * from a with(updlock) where [id] in (2,3,4)
waitfor delay '00:00:04'
commit tran
在另外一個sql串連中這樣寫:
select * from a with(updlock) where [id] =4
發現第二個串連裡的sql語句必須等到第一個串連裡的事務完成才執行完成,這是因為第二個串連的更新鎖定認為第一個串連裡的更新鎖定可能會進行修改
轉換為排它鎖,所以要等第一個串連的事務執行完成才執行。如果第二個串連裡的sql語句這樣寫:select * from a with(holdlock) where [id]
=4,則不不用等第一個串連事務執行完畢才執行。