Sql Server 鎖

來源:互聯網
上載者:User

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,則不不用等第一個串連事務執行完畢才執行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.