㈠ 關於sqlserver資料庫 鎖機制的小疑問,下種情況是否需要加入鎖機制
不需要,就算確實用戶同時執行,資料庫的操作機制是有隊列的,所以不存在並發情況。
鎖基本用不到,我反正開發了5年了沒用到過。
你要了解死鎖發生的情況,一般是用事務的時候可能會碰到死鎖,你申請了A資源,鎖住了A然後申請B資源,其他人申請了B資源,然後申請A,這樣就互不相讓,導致A,B資源都不可訪問了,不過其他數據我不知道,SQLSERVER發生這種死鎖不是一直鎖死的,過幾分鍾就會發現這個死鎖,把鎖釋放掉,2個事務都失敗。
㈡ sqlserver怎麼實現一個行鎖
1如何鎖一個表的某一行
SELECT*FROMtableROWLOCKWHEREid=1
2鎖定資料庫的一個表
SELECT*FROMtableWITH(HOLDLOCK)
加鎖語句:
sybase:
update表setcol1=col1where1=0;
MSSQL:
selectcol1from表(tablockx)where1=0;
oracle:
LOCKTABLE表INEXCLUSIVEMODE;
加鎖後其它人不可操作,直到加鎖用戶解鎖,用commit或rollback解鎖
㈢ sqlserver鎖表機制
這個問題要具體分析:
第一,事務隔離級別基本兩種模式,一種是阻塞式(read committed,repeatable read,serializable)
,一種是非阻塞式(read uncommitted,snapshot)。
默認是read committed,這種情況一般在更新表的時候,如果不使用hint 提示,基本是先對表添加IX鎖,級別不算高,基本和其他鎖兼容,但是repeatable read,serializable 事務隔離級別就會先對表添加IX鎖,然後向X鎖轉化,而X鎖和大多數鎖都不兼容,容易發生表阻塞。
第二種隔離級別不會有以上問題,但是又引入了其它的問題。
以上是一種情況。
另外一種就是 鎖升級,一個鎖是96B內存,如果太多,sqlserver就會升級為表鎖,一般是5000以上行級鎖就升級為一個表X鎖。
所以適當的文件分組和表分區 是有必要的。
其次就是資源互相引用導致事務長時間不能釋放,導致真正的死鎖,不過SQL2005以後,這種情況發生的概率很低。
留個問題你自己去想。
兩個SQL,兩個連接,同時執行。
update A set A.NAME=xxx where A.id=55
update A set A.NAME=xxx where A.id=56, 如果 56 不存在你說會發生什麼情況呢?
㈣ 如何掌握SQLServer的鎖機制
SQL SERVER里的鎖機制:
NOLOCK(不加鎖)
此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的「臟數據」。
HOLDLOCK(保持鎖)
此選項被選中時,SQL Server 會將此共享鎖保持至整個事務結束,而不會在途中釋放。 例如,「 SELECT * FROM my_table HOLDLOCK」就要求在整個查詢過程中,保持對表的鎖定,直到查詢完成才釋放鎖定。
UPDLOCK(修改鎖)
此選項被選中時,SQL Server 在讀取數據時使用修改鎖來代替共享鎖,並將此鎖保持至整個事務或命令結束。使用此選項能夠保證多個進程能同時讀取數據但只有該進程能修改數據。
TABLOCK(表鎖)
此選項被選中時,SQL Server 將在整個表上置共享鎖直至該命令結束。 這個選項保證其他進程只能讀取而不能修改數據。
PAGLOCK(頁鎖)
此選項為默認選項, 當被選中時,SQL Server 使用共享頁鎖。
TABLOCKX(排它表鎖)
此選項被選中時,SQL Server 將在整個表上置排它鎖直至該命令或事務結束。這將防止其他進程讀取或修改表中的數據。
㈤ 求助,sqlserver什麼情況下會鎖表
鎖的類別有兩種分法:
從資料庫系統的角度來看鎖分為獨占鎖(即排它鎖),共享鎖和更新鎖
MS-SQL Server 使用以下資源鎖模式。
鎖模式 描述
共享 (S) 用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句。
更新 (U) 用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。
㈥ 轉SQLSERVER 會不會自動加鎖
[SQL]提升查詢效率與避免LOCK發生nolock: 可能把沒有提交事務的數據也顯示出來,可能會產生臟讀readpast: 會把被鎖住的行不顯示出來
所有Select加 With (NoLock)解決阻塞死鎖
在查詢語句中使用 NOLOCK 和 READPAST
處理一個資料庫死鎖的異常時候,其中一個建議就是使用 NOLOCK 或者 READPAST 。有關 NOLOCK 和 READPAST的一些技術知識點:
對於非銀行等嚴格要求事務的行業,搜索記錄中出現或者不出現某條記錄,都是在可容忍范圍內,所以碰到死鎖,應該首先考慮,我們業務邏輯是否能容忍出現或者不出現某些記錄,而不是尋求對雙方都加鎖條件下如何解鎖的問題。
NOLOCK 和 READPAST 都是處理查詢、插入、刪除等操作時候,如何應對鎖住的數據記錄。但是這時候一定要注意NOLOCK 和 READPAST的局限性,確認你的業務邏輯可以容忍這些記錄的出現或者不出現:
簡單來說:
NOLOCK 可能把沒有提交事務的數據也顯示出來.
READPAST 會把被鎖住的行不顯示出來
不使用 NOLOCK 和 READPAST ,在 Select 操作時候則有可能報錯誤:事務(進程 ID **)與另一個進程被死鎖在 鎖 資源上,並且已被選作死鎖犧牲品。
下面就來演示這個情況。
為了演示兩個事務死鎖的情況,我們下面的測試都需要在SQL Server Management Studio中打開兩個查詢窗口。保證事務不被干擾。
演示一 沒有提交的事務,NOLOCK 和 READPAST處理的策略:
查詢窗口一請執行如下腳本:
CREATE TABLE t1 (c1 int IDENTITY(1,1), c2 int)
go
BEGIN TRANSACTION
insert t1(c2) values(1)
在查詢窗口一執行後,查詢窗口二執行如下腳本:
select count(*) from t1 WITH(NOLOCK)
select count(*) from t1 WITH(READPAST)
結果與分析:
查詢窗口二依次顯示統計結果為: 1、0
查詢窗口一的命令沒有提交事務,所以 READPAST 不會計算沒有提交事務的這一條記錄,這一條被鎖住了,READPAST 看不到;而NOLOCK則可以看到被鎖住的這一條記錄。
如果這時候我們在查詢窗口二中執行:
select count(*) from t1 就會看到這個執行很久不能執行完畢,因為這個查詢遇到了一個死鎖。
清除掉這個測試環境,需要在查詢窗口一中再執行如下語句:
ROLLBACK TRANSACTION
drop table t1
演示二:對被鎖住的記錄,NOLOCK 和 READPAST處理的策略
這個演示同樣需要兩個查詢窗口。
請在查詢窗口一中執行如下語句:
CREATE TABLE t2 (UserID int , NickName nvarchar(50))
go
insert t2(UserID,NickName) values(1,'郭紅俊')
insert t2(UserID,NickName) values(2,'蟈蟈俊')
go
BEGIN TRANSACTION
update t2 set NickName = '蟈蟈俊.net' where UserID = 2
請在查詢窗口二中執行如下腳本:
select * from t2 WITH(NOLOCK) where UserID = 2
select * from t2 WITH(READPAST) where UserID = 2
結果與分析:
查詢窗口二中, NOLOCK 對應的查詢結果中我們看到了修改後的記錄,READPAST對應的查詢結果中我們沒有看到任何一條記錄。 這種情況下就可能發生臟讀
㈦ SQLSERVER 怎麼實現select行級鎖
如何在SQLServer中鎖定某行記錄 SELECT au_lname FROM authors WITH (ROWLOCK ) 鎖定提示 描述 HOLDLOCK 將共享鎖保留到事務完成,而不是在相應的表、行或數據頁不再需要時就立即釋放鎖。HOLDLOCK等同於SERIALIZABLE。
㈧ sqlserver 中鎖用的多嗎
給你個最詳細的吧 可能有你要的內容 鎖的概述 一. 為什麼要引入鎖 多個用戶同時對資料庫的並發操作時會帶來以下數據不一致的問題: 丟失更新 A,B兩個用戶讀同一數據並進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統 臟讀 A...
㈨ sqlserver 存儲過程帶鎖怎麼辦
就你上面的事例而言,select的共享鎖性質是得到結果即釋放,不會在事務中保留
而update所用到的U鎖及其進一步的X鎖則需要持續到事務的結束
如果是多線程的程序的話,在select與update處都可能會出現鎖等待,這要根據實際操作中數據是否沖突來看
㈩ 解析:如何快速掌握SQLServer的鎖機制
各種大型資料庫所採用的鎖的基本理論是一致的,但在具體實現上各有差別。SQLServer更強調由系統來管理鎖。在用戶有SQL請求時,系統分析請求,自動在滿足鎖定條件和系統性能之間為資料庫加上適當的鎖,同時系統在運行期間常常自動進行優化處理,實行動態加鎖。對於一般的用戶而言,通過系統的自動鎖定管理機制基本可以滿足使用要求,但如果對數據安全、資料庫完整性和一致性有特殊要求,就需要了解SQLServer的鎖機制,掌握資料庫鎖定方法。 鎖是資料庫中的一個非常重要的概念,它主要用於多用戶環境下保證資料庫完整性和一致性。我們知道,多個用戶能夠同時操縱同一個資料庫中的數據,會發生數據不一致現象。即如果沒有鎖定且多個用戶同時訪問一個資料庫,則當他們的事務同時使用相同的數據時可能會發生問題。這些問題包括:丟失更新、臟讀、不可重復讀和幻覺讀: 1.當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致數據丟失。例如,兩個編輯人員製作了同一文檔的電子復本。每個編輯人員獨立地更改其復本,然後保存更改後的復本,這樣就覆蓋了原始文檔。最後保存其更改復本的編輯人員覆蓋了第一個編輯人員所做的更改。如果在第一個編輯人員完成之後第二個編輯人員才能進行更改,則可以避免該問題。 2.臟讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。因為這個數據是還沒有提交的數據,那麼另外一個事務讀到的這個數據是臟數據,依據臟數據所做的操作可能是不正確的。例如,一個編輯人員正在更改電子文檔。在更改過程中,另一個編輯人員復制了該文檔(該復本包含到目前為止所做的全部更改)並將其分發給預期的用戶。此後,第一個編輯人員認為目前所做的更改是錯誤的,於是刪除了所做的編輯並保存了文檔。分發給用戶的文檔包含不再存在的編輯內容,並且這些編輯內容應認為從未存在過。如果在第一個編輯人員確定最終更改前任何人都不能讀取更改的文檔,則可以避免該問題。 3.不可重復讀是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀。例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重復。如果只有在作者全部完成編寫後編輯人員才可以讀取文檔,則可以避免該問題。 4.幻覺讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合並到該文檔的主復本時,發現作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。 所以,處理多用戶並發訪問的方法是加鎖。鎖是防止其他事務訪問指定的資源控制、實現並發控制的一種主要手段。當一個用戶鎖住資料庫中的某個對象時,其他用戶就不能再訪問該對象。加鎖對並發訪問的影響體現在鎖的粒度上。為了控制鎖定的資源,應該首先了解系統的空間管理。在SQLServer2000系統中,最小的空間管理單位是頁,一個頁有8K。所有的數據、日誌、索引都存放在頁上。另外,使用頁有一個限制,這就是表中的一行數據必須在同一個頁上,不能跨頁。頁上面的空間管理單位是盤區,一個盤區是8個連續的頁。表和索引的最小佔用單位是盤區。資料庫是由一個或者多個表或者索引組成,即是由多個盤區組成。放在一個表上的鎖限制對整個表的並發訪問;放在盤區上的鎖限制了對整個盤區的訪問;放在數據頁上的鎖限制了對整個數據頁的訪問;放在行上的鎖只限制對該行的並發訪問。 SQLServer2000具有多粒度鎖定,允許一個事務鎖定不同類型的的資源。為了使鎖定的成本減至最少,SQLServer自動將資源鎖定在適合任務的級別。鎖定在較小的粒度(例如行)可以增加並發但需要較大的開銷,因為如果鎖定了許多行,則需要控制更多的鎖。鎖定在較大的粒度(例如表)就並發而言是相當昂貴的,因為鎖定整個表限制了其它事務對表中任意部分進行訪問,但要求的開銷較低,因為需要維護的鎖較少。SQLServer可以鎖定行、頁、擴展盤區、表、庫等資源。 行是可以鎖定的最小空間,行級鎖佔用的數據資源最少,所以在事務的處理過程中,允許其他事務繼續操縱同一個表或者同一個頁的其他數據,大大降低了其他事務等待處理的時間,提高了系統的並發性。 頁級鎖是指在事務的操縱過程中,無論事務處理數據的多少,每一次都鎖定一頁,在這個頁上的數據不能被其他事務操縱。在SQLServer7.0以前,使用的是頁級鎖。頁級鎖鎖定的資源比行級鎖鎖定的數據資源多。在頁級鎖中,即使是一個事務只操縱頁上的一行數據,那麼該頁上的其他數據行也不能被其他事務使用。因此,當使用頁級鎖時,會出現數據的浪費現象,也就是說,在同一個頁上會出現數據被佔用卻沒有使用的現象。在這種現象中,數據的浪費最多不超過一個頁上的數據行。 表級鎖也是一個非常重要的鎖。表級鎖是指事務在操縱某一個表的數據時,鎖定了這個數據所在的整個表,其他事務不能訪問該表中的其他數據。當事務處理的數據量比較大時,一般使用表級鎖。表級鎖的特點是使用比較少的系統資源,但是卻佔用比較多的數據資源。與行級鎖和頁級鎖相比,表級鎖佔用的系統資源例如內存比較少,但是佔用的數據資源卻是最大。在表級鎖時,有可能出現數據的大量浪費現象,因為表級鎖鎖定整個表,那麼其他的事務都不能操縱表中的其他數據。 盤區鎖是一種特殊類型的鎖,只能用在一些特殊的情況下。簇級鎖就是指事務佔用一個盤區,這個盤區不能同時被其他事務佔用。例如在創建資料庫和創建表時,系統分配物理空間時使用這種類型的鎖。系統是按照盤區分配空間的。當系統分配空間時,使用盤區鎖,防止其他事務同時使用同一個盤區。當系統完成分配空間之後,就不再使用這種類型的盤區鎖。特別是,當涉及到對數據操作的事務時,不使用盤區鎖。 資料庫級鎖是指鎖定整個資料庫,防止任何用戶或者事務對鎖定的資料庫進行訪問。資料庫級鎖是一種非常特殊的鎖,它只是用於資料庫的恢復操作過程中。這種等級的鎖是一種最高等級的鎖,因為它控制整個資料庫的操作。只要對資料庫進行恢復操作,那麼就需要設置資料庫為單用戶模式,這樣系統就能防止其他用戶對該資料庫進行各種操作。 行級鎖是一種最優鎖,因為行級鎖不可能出現數據既被佔用又沒有使用的浪費現象。但是,如果用戶事務中頻繁對某個表中的多條記錄操作,將導致對該表的許多記錄行都加上了行級鎖,資料庫系統中鎖的數目會急劇增加,這樣就加重了系統負荷,影響系統性能。因此,在SQLServer中,還支持鎖升級(lockescalation)。所謂鎖升級是指調整鎖的粒度,將多個低粒度的鎖替換成少數的更高粒度的鎖,以此來降低系統負荷。在SQLServer中當一個事務中的鎖較多,達到鎖升級門限時,系統自動將行級鎖和頁面鎖升級為表級鎖。