在sql server資料庫中加鎖時,除了可以對不同的資源加鎖,還可以使用不同程度的加鎖方式,即有多種模式,sql server中鎖模式包括:
1.共享鎖(s) 共享鎖用於所以的制度資料操作。共享鎖是非獨佔的,允許多個併發事務讀取其鎖定的資源。預設情況下,資料被讀取後,sql server立刻釋放共享鎖。
例如: 執行查詢"select * from dbo.customer"時,首先鎖定第一頁,讀取之後,釋放對第一頁的鎖定,然後鎖定第二頁。這樣,就允許在讀操作過程中,修改未被鎖定的第一頁。但是,事務隔離級別鏈結選項設定和select語句中的鎖定設定都可以改變sql server的這種預設設定。
執行查詢"select * from dbo.customer with(holdlock)"就要求在整個查詢過程中,保持對錶的鎖定,直到查詢完成才釋放鎖定。
2.更新鎖(u) 更新鎖在修改操作的初始化階段用來鎖定可能要被修改的資源,這樣可以避免使用共享鎖(s)造成的死鎖現象。因為使用共享鎖(s)時,修改資料的操作分為兩步,首先獲得乙個共享鎖(s),讀取資料,然後再將共享鎖公升級為排它鎖(x),然後執行修改操作。這樣如果同時又兩個或多個事務同時對乙個事務申請共享鎖,在修改資料的時候,這些事務將共享鎖公升級為排它鎖(x)。這時,這些事務都不會釋放共享鎖而是一直等待對方釋放,這樣就造成了死鎖。如果乙個資料在修改前直接申請更新鎖(u),在資料修改的時候再公升級為排它鎖(x),就可以避免死鎖。
3.結構鎖(sch) 執行表的資料定義語言(ddl)操作(例如新增列或除去表)時使用架構修改(sch-m)鎖。當編譯查詢時,使用架構穩定性(sch-s)鎖。架構穩定性鎖不阻塞任何事務鎖,包括排它鎖。因此在編譯查詢時,其它事務(包括在表上有排它鎖的事務)都能繼續執行。但不能在表上執行ddl操作。
4.意向鎖(i) 意向鎖說明sql server有在資源的底層獲得共享鎖或排它鎖的意向。資料庫引擎使用意向鎖來保護共享鎖或排它鎖放置在鎖層次結構的底層資源上。意向鎖之所以命名為意向鎖,是因為在較低級別鎖前可獲取它們,因此會通知意向將鎖放置在較低級別上。
例如:表級的共享意向鎖說明事務意圖講排它鎖釋放在表中的頁或者行。
意向鎖有可以分為:
共享意向鎖(is):事務意圖在共享意向鎖所鎖定的底層資源上放置共享鎖來讀取資料。
排它意向鎖(ix):事務意圖在共享鎖鎖定的資源上放置排它鎖來修改資料。
共享式排它意向鎖(six):事務允許其他事務使用共享鎖來讀取頂層資源,並意圖在該資源低層上放置排它鎖。
意向鎖的兩種用途:
5.大容量更新鎖(bu) 當將資料大容量複製到表,且指定了tablock提示或者使用sp_tableoption設定了table lock on bulk表選項時,將使用大容量更新鎖。大容量更新鎖允許程序將資料併發大容量複製到同一表,同時防止其它不進行大容量複製資料的程序訪問該錶。
sql server使用加鎖功能說明:
1. 死鎖
使用或管理資料庫都不可避免的涉及到死鎖,一旦發生死鎖,資料相互等待對方資源的釋放,會阻止對資料的訪問,嚴重會造成db掛掉,當資源被鎖定,無法被訪問時,可以終止訪問db的那個session來達到解鎖的目的(即kill掉造成鎖的那個程序)。
在兩個或多個任務中,如果每個任務鎖定了其它任務試圖鎖定的資源,此時會造成這些任務永久阻塞,從而出現死鎖。例如:
事務b完成之後事務a才能完成,但是事務b由事務a阻塞。該條件也稱為迴圈依賴關係:事務a依賴於事務b,事務b通過對事務a的依賴關係關閉迴圈。
除非摸個外部程序斷開死鎖,否則死鎖中的兩個事務都將無線期等待下去。sql server資料庫引擎死鎖監視器定期檢查陷入死鎖的任務。如果監視器檢測到迴圈依賴關係,將選擇其中乙個任務作為犧牲品,然後終止其事務並提示錯誤。這樣,其它任務就可以完成其事務。對於事務以鎖霧終止的應用程式,它還可以重試該事務,但通常要等到其它一起陷入死鎖的其它事務完成後執行。
2. 死鎖檢測
死鎖示例:
第乙個連線中執行:
begin第二個連線中執行tran
update dbo.customer set nric=
'1000
'where transactionnumber=
6waitfor delay '
00:00:30
'update dbo.employee set ts=
1111
where transactionnumber=
1commit
begin如果兩個連線同時執行資料庫(sql server2008)會自動檢測到死鎖,終止其中乙個程序。tran
update dbo.employee set ts=
1111
where transactionnumber=
1waitfor delay '
00:00:10
'update dbo.customer set nric=
'1000
'where transactionnumber=
6commit
檢視MSSQLServer鎖的方法1
他人的 sp who可以返回如下資訊 可選引數loginname,或active代表活動會話數 spid 系統程序id status 程序狀態 loginame 使用者登入名 hostname 使用者主機名 blkby 阻塞程序的spid dbname 程序正在使用的資料庫名 cmd 當前正在執行的...
MSSql Server事務和鎖研究
鎖 主要指共享 鎖和排他鎖兩種經常用到的鎖。隔離級別 設定在事務上的,共享鎖的鎖定時間與事務的隔離級別有關。update和delete預設都發出排他鎖。隔離級別 髒讀 不可重複讀取 幻像 說明未提交讀 read uncommitted 是 是 是 如果其他事務更新,不管是否提交,立即執行 提交讀 r...
MS SQL Server版本的選擇
這兩天尋思著將用了很久的sql server express edtion換一換,因為這畢竟是個免費版,很多功能,包括使用起來感覺不是很好,但是面對sql server的一大堆版本,我茫然了,不知道該怎麼選擇,真的感到很糾結,一般sql server有如下幾個版本,先來做個大概介紹.2,標準版 st...