真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

sqlserver鎖設(shè)置,sql server 鎖表和解鎖

sqlserver怎么實現(xiàn)一個行鎖

1?如何鎖一個表的某一行?

大同網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

SET?TRANSACTION?ISOLATION?LEVEL?READ?UNCOMMITTED?

SELECT?*?FROM?table?ROWLOCK?WHERE?id?=?1?

2?鎖定數(shù)據(jù)庫的一個表?

SELECT?*?FROM?table?WITH?(HOLDLOCK)?

加鎖語句:

sybase:

update?表?set?col1=col1?where?1=0?;

MSSQL:

select?col1?from?表?(tablockx)?where?1=0?;

oracle:

LOCK?TABLE?表?IN?EXCLUSIVE?MODE?;

加鎖后其它人不可操作,直到加鎖用戶解鎖,用commit或rollback解鎖

如何在SQLServer中鎖定某行記錄

如何在SQLServer中鎖定某行記錄

SELECT au_lname FROM authors WITH (ROWLOCK )

鎖定提示 描述

HOLDLOCK 將共享鎖保留到事務(wù)完成,而不是在相應(yīng)的表、行或數(shù)據(jù)頁不再需要時就立即釋放鎖。HOLDLOCK等同于SERIALIZABLE。

NOLOCK 不要發(fā)出共享鎖,并且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務(wù)或一組在讀取中間回滾的頁面。有可能發(fā)生臟讀。僅應(yīng)用于 SELECT語句。

PAGLOCK 在通常使用單個表鎖的地方采用頁鎖。

READCOMMITTED 用與運行在提交讀隔離級別的事務(wù)相同的鎖語義執(zhí)行掃描。默認情況下,SQLServer 2000 在此隔離級別上操作。

READPAST 跳過鎖定行。此選項導致事務(wù)跳過由其它事務(wù)鎖定的行(這些行平常會顯示在結(jié)果集內(nèi)),而不是阻塞該事務(wù),使其等待其它事務(wù)釋放在這些行上的鎖。READPAST 鎖提示僅適用于運行在提交讀隔離級別的事務(wù),并且只在行級鎖之后讀取。僅適用于SELECT 語句。

解析:如何快速掌握SQLServer的鎖機制

各種大型數(shù)據(jù)庫所采用的鎖的基本理論是一致的,但在具體實現(xiàn)上各有差別。SQLServer更強調(diào)由系統(tǒng)來管理鎖。在用戶有SQL請求時,系統(tǒng)分析請求,自動在滿足鎖定條件和系統(tǒng)性能之間為數(shù)據(jù)庫加上適當?shù)逆i,同時系統(tǒng)在運行期間常常自動進行優(yōu)化處理,實行動態(tài)加鎖。對于一般的用戶而言,通過系統(tǒng)的自動鎖定管理機制基本可以滿足使用要求,但如果對數(shù)據(jù)安全、數(shù)據(jù)庫完整性和一致性有特殊要求,就需要了解SQLServer的鎖機制,掌握數(shù)據(jù)庫鎖定方法。 鎖是數(shù)據(jù)庫中的一個非常重要的概念,它主要用于多用戶環(huán)境下保證數(shù)據(jù)庫完整性和一致性。我們知道,多個用戶能夠同時操縱同一個數(shù)據(jù)庫中的數(shù)據(jù),會發(fā)生數(shù)據(jù)不一致現(xiàn)象。即如果沒有鎖定且多個用戶同時訪問一個數(shù)據(jù)庫,則當他們的事務(wù)同時使用相同的數(shù)據(jù)時可能會發(fā)生問題。這些問題包括:丟失更新、臟讀、不可重復讀和幻覺讀: 1.當兩個或多個事務(wù)選擇同一行,然后基于最初選定的值更新該行時,會發(fā)生丟失更新問題。每個事務(wù)都不知道其它事務(wù)的存在。最后的更新將重寫由其它事務(wù)所做的更新,這將導致數(shù)據(jù)丟失。例如,兩個編輯人員制作了同一文檔的電子復本。每個編輯人員獨立地更改其復本,然后保存更改后的復本,這樣就覆蓋了原始文檔。最后保存其更改復本的編輯人員覆蓋了第一個編輯人員所做的更改。如果在第一個編輯人員完成之后第二個編輯人員才能進行更改,則可以避免該問題。 2.臟讀就是指當一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個事務(wù)讀到的這個數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。例如,一個編輯人員正在更改電子文檔。在更改過程中,另一個編輯人員復制了該文檔(該復本包含到目前為止所做的全部更改)并將其分發(fā)給預期的用戶。此后,第一個編輯人員認為目前所做的更改是錯誤的,于是刪除了所做的編輯并保存了文檔。分發(fā)給用戶的文檔包含不再存在的編輯內(nèi)容,并且這些編輯內(nèi)容應(yīng)認為從未存在過。如果在第一個編輯人員確定最終更改前任何人都不能讀取更改的文檔,則可以避免該問題。 3.不可重復讀是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時,另外一個事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改,那么第一個事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復讀。例如,一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重復。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題。 4.幻覺讀是指當事務(wù)不是獨立執(zhí)行時發(fā)生的一種現(xiàn)象,例如第一個事務(wù)對一個表中的數(shù)據(jù)進行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時,第二個事務(wù)也修改這個表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復本時,發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。 所以,處理多用戶并發(fā)訪問的方法是加鎖。鎖是防止其他事務(wù)訪問指定的資源控制、實現(xiàn)并發(fā)控制的一種主要手段。當一個用戶鎖住數(shù)據(jù)庫中的某個對象時,其他用戶就不能再訪問該對象。加鎖對并發(fā)訪問的影響體現(xiàn)在鎖的粒度上。為了控制鎖定的資源,應(yīng)該首先了解系統(tǒng)的空間管理。在SQLServer2000系統(tǒng)中,最小的空間管理單位是頁,一個頁有8K。所有的數(shù)據(jù)、日志、索引都存放在頁上。另外,使用頁有一個限制,這就是表中的一行數(shù)據(jù)必須在同一個頁上,不能跨頁。頁上面的空間管理單位是盤區(qū),一個盤區(qū)是8個連續(xù)的頁。表和索引的最小占用單位是盤區(qū)。數(shù)據(jù)庫是由一個或者多個表或者索引組成,即是由多個盤區(qū)組成。放在一個表上的鎖限制對整個表的并發(fā)訪問;放在盤區(qū)上的鎖限制了對整個盤區(qū)的訪問;放在數(shù)據(jù)頁上的鎖限制了對整個數(shù)據(jù)頁的訪問;放在行上的鎖只限制對該行的并發(fā)訪問。 SQLServer2000具有多粒度鎖定,允許一個事務(wù)鎖定不同類型的的資源。為了使鎖定的成本減至最少,SQLServer自動將資源鎖定在適合任務(wù)的級別。鎖定在較小的粒度(例如行)可以增加并發(fā)但需要較大的開銷,因為如果鎖定了許多行,則需要控制更多的鎖。鎖定在較大的粒度(例如表)就并發(fā)而言是相當昂貴的,因為鎖定整個表限制了其它事務(wù)對表中任意部分進行訪問,但要求的開銷較低,因為需要維護的鎖較少。SQLServer可以鎖定行、頁、擴展盤區(qū)、表、庫等資源。 行是可以鎖定的最小空間,行級鎖占用的數(shù)據(jù)資源最少,所以在事務(wù)的處理過程中,允許其他事務(wù)繼續(xù)操縱同一個表或者同一個頁的其他數(shù)據(jù),大大降低了其他事務(wù)等待處理的時間,提高了系統(tǒng)的并發(fā)性。 頁級鎖是指在事務(wù)的操縱過程中,無論事務(wù)處理數(shù)據(jù)的多少,每一次都鎖定一頁,在這個頁上的數(shù)據(jù)不能被其他事務(wù)操縱。在SQLServer7.0以前,使用的是頁級鎖。頁級鎖鎖定的資源比行級鎖鎖定的數(shù)據(jù)資源多。在頁級鎖中,即使是一個事務(wù)只操縱頁上的一行數(shù)據(jù),那么該頁上的其他數(shù)據(jù)行也不能被其他事務(wù)使用。因此,當使用頁級鎖時,會出現(xiàn)數(shù)據(jù)的浪費現(xiàn)象,也就是說,在同一個頁上會出現(xiàn)數(shù)據(jù)被占用卻沒有使用的現(xiàn)象。在這種現(xiàn)象中,數(shù)據(jù)的浪費最多不超過一個頁上的數(shù)據(jù)行。 表級鎖也是一個非常重要的鎖。表級鎖是指事務(wù)在操縱某一個表的數(shù)據(jù)時,鎖定了這個數(shù)據(jù)所在的整個表,其他事務(wù)不能訪問該表中的其他數(shù)據(jù)。當事務(wù)處理的數(shù)據(jù)量比較大時,一般使用表級鎖。表級鎖的特點是使用比較少的系統(tǒng)資源,但是卻占用比較多的數(shù)據(jù)資源。與行級鎖和頁級鎖相比,表級鎖占用的系統(tǒng)資源例如內(nèi)存比較少,但是占用的數(shù)據(jù)資源卻是最大。在表級鎖時,有可能出現(xiàn)數(shù)據(jù)的大量浪費現(xiàn)象,因為表級鎖鎖定整個表,那么其他的事務(wù)都不能操縱表中的其他數(shù)據(jù)。 盤區(qū)鎖是一種特殊類型的鎖,只能用在一些特殊的情況下。簇級鎖就是指事務(wù)占用一個盤區(qū),這個盤區(qū)不能同時被其他事務(wù)占用。例如在創(chuàng)建數(shù)據(jù)庫和創(chuàng)建表時,系統(tǒng)分配物理空間時使用這種類型的鎖。系統(tǒng)是按照盤區(qū)分配空間的。當系統(tǒng)分配空間時,使用盤區(qū)鎖,防止其他事務(wù)同時使用同一個盤區(qū)。當系統(tǒng)完成分配空間之后,就不再使用這種類型的盤區(qū)鎖。特別是,當涉及到對數(shù)據(jù)操作的事務(wù)時,不使用盤區(qū)鎖。 數(shù)據(jù)庫級鎖是指鎖定整個數(shù)據(jù)庫,防止任何用戶或者事務(wù)對鎖定的數(shù)據(jù)庫進行訪問。數(shù)據(jù)庫級鎖是一種非常特殊的鎖,它只是用于數(shù)據(jù)庫的恢復操作過程中。這種等級的鎖是一種最高等級的鎖,因為它控制整個數(shù)據(jù)庫的操作。只要對數(shù)據(jù)庫進行恢復操作,那么就需要設(shè)置數(shù)據(jù)庫為單用戶模式,這樣系統(tǒng)就能防止其他用戶對該數(shù)據(jù)庫進行各種操作。 行級鎖是一種最優(yōu)鎖,因為行級鎖不可能出現(xiàn)數(shù)據(jù)既被占用又沒有使用的浪費現(xiàn)象。但是,如果用戶事務(wù)中頻繁對某個表中的多條記錄操作,將導致對該表的許多記錄行都加上了行級鎖,數(shù)據(jù)庫系統(tǒng)中鎖的數(shù)目會急劇增加,這樣就加重了系統(tǒng)負荷,影響系統(tǒng)性能。因此,在SQLServer中,還支持鎖升級(lockescalation)。所謂鎖升級是指調(diào)整鎖的粒度,將多個低粒度的鎖替換成少數(shù)的更高粒度的鎖,以此來降低系統(tǒng)負荷。在SQLServer中當一個事務(wù)中的鎖較多,達到鎖升級門限時,系統(tǒng)自動將行級鎖和頁面鎖升級為表級鎖。

sqlserver鎖表機制

這個問題要具體分析:

第一,事務(wù)隔離級別基本兩種模式,一種是阻塞式(read committed,repeatable read,serializable)

,一種是非阻塞式(read uncommitted,snapshot)。

默認是read committed,這種情況一般在更新表的時候,如果不使用hint 提示,基本是先對表添加IX鎖,級別不算高,基本和其他鎖兼容,但是repeatable read,serializable 事務(wù)隔離級別就會先對表添加IX鎖,然后向X鎖轉(zhuǎn)化,而X鎖和大多數(shù)鎖都不兼容,容易發(fā)生表阻塞。

第二種隔離級別不會有以上問題,但是又引入了其它的問題。

以上是一種情況。

另外一種就是 鎖升級,一個鎖是96B內(nèi)存,如果太多,sqlserver就會升級為表鎖,一般是5000以上行級鎖就升級為一個表X鎖。

所以適當?shù)奈募纸M和表分區(qū) 是有必要的。

其次就是資源互相引用導致事務(wù)長時間不能釋放,導致真正的死鎖,不過SQL2005以后,這種情況發(fā)生的概率很低。

留個問題你自己去想。

兩個SQL,兩個連接,同時執(zhí)行。

update A set A.NAME=xxx where A.id=55

update A set A.NAME=xxx where A.id=56, 如果 56 不存在你說會發(fā)生什么情況呢?

SQL SERVER 中如何使用行鎖? 為什么我寫的行鎖鎖不住啊?高手快來吧

給你個最詳細的吧 可能有你要的內(nèi)容

鎖的概述

一. 為什么要引入鎖

多個用戶同時對數(shù)據(jù)庫的并發(fā)操作時會帶來以下數(shù)據(jù)不一致的問題:

丟失更新

A,B兩個用戶讀同一數(shù)據(jù)并進行修改,其中一個用戶的修改結(jié)果破壞了另一個修改的結(jié)果,比如訂票系統(tǒng)

臟讀

A用戶修改了數(shù)據(jù),隨后B用戶又讀出該數(shù)據(jù),但A用戶因為某些原因取消了對數(shù)據(jù)的修改,數(shù)據(jù)恢復原值,此時B得到的數(shù)據(jù)就與數(shù)據(jù)庫內(nèi)的數(shù)據(jù)產(chǎn)生了不一致

不可重復讀

A用戶讀取數(shù)據(jù),隨后B用戶讀出該數(shù)據(jù)并修改,此時A用戶再讀取數(shù)據(jù)時發(fā)現(xiàn)前后兩次的值不一致

并發(fā)控制的主要方法是封鎖,鎖就是在一段時間內(nèi)禁止用戶做某些操作以避免產(chǎn)生數(shù)據(jù)不一致

二 鎖的分類

鎖的類別有兩種分法:

1. 從數(shù)據(jù)庫系統(tǒng)的角度來看:分為獨占鎖(即排它鎖),共享鎖和更新鎖

MS-SQL Server 使用以下資源鎖模式。

鎖模式 描述

共享 (S) 用于不更改或不更新數(shù)據(jù)的操作(只讀操作),如 SELECT 語句。

更新 (U) 用于可更新的資源中。防止當多個會話在讀取、鎖定以及隨后可能進行的資源更新時發(fā)生常見形式的死鎖。

排它 (X) 用于數(shù)據(jù)修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。

意向鎖 用于建立鎖的層次結(jié)構(gòu)。意向鎖的類型為:意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

架構(gòu)鎖 在執(zhí)行依賴于表架構(gòu)的操作時使用。架構(gòu)鎖的類型為:架構(gòu)修改 (Sch-M) 和架構(gòu)穩(wěn)定性 (Sch-S)。

大容量更新 (BU) 向表中大容量復制數(shù)據(jù)并指定了 TABLOCK 提示時使用。

共享鎖

共享 (S) 鎖允許并發(fā)事務(wù)讀取 (SELECT) 一個資源。資源上存在共享 (S) 鎖時,任何其它事務(wù)都不能修改數(shù)據(jù)。一旦已經(jīng)讀取數(shù)據(jù),便立即釋放資源上的共享 (S) 鎖,除非將事務(wù)隔離級別設(shè)置為可重復讀或更高級別,或者在事務(wù)生存周期內(nèi)用鎖定提示保留共享 (S) 鎖。

更新鎖

更新 (U) 鎖可以防止通常形式的死鎖。一般更新模式由一個事務(wù)組成,此事務(wù)讀取記錄,獲取資源(頁或行)的共享 (S) 鎖,然后修改行,此操作要求鎖轉(zhuǎn)換為排它 (X) 鎖。如果兩個事務(wù)獲得了資源上的共享模式鎖,然后試圖同時更新數(shù)據(jù),則一個事務(wù)嘗試將鎖轉(zhuǎn)換為排它 (X) 鎖。共享模式到排它鎖的轉(zhuǎn)換必須等待一段時間,因為一個事務(wù)的排它鎖與其它事務(wù)的共享模式鎖不兼容;發(fā)生鎖等待。第二個事務(wù)試圖獲取排它 (X) 鎖以進行更新。由于兩個事務(wù)都要轉(zhuǎn)換為排它 (X) 鎖,并且每個事務(wù)都等待另一個事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。

若要避免這種潛在的死鎖問題,請使用更新 (U) 鎖。一次只有一個事務(wù)可以獲得資源的更新 (U) 鎖。如果事務(wù)修改資源,則更新 (U) 鎖轉(zhuǎn)換為排它 (X) 鎖。否則,鎖轉(zhuǎn)換為共享鎖。

排它鎖

排它 (X) 鎖可以防止并發(fā)事務(wù)對資源進行訪問。其它事務(wù)不能讀取或修改排它 (X) 鎖鎖定的數(shù)據(jù)。

意向鎖

意向鎖表示 SQL Server 需要在層次結(jié)構(gòu)中的某些底層資源上獲取共享 (S) 鎖或排它 (X) 鎖。例如,放置在表級的共享意向鎖表示事務(wù)打算在表中的頁或行上放置共享 (S) 鎖。在表級設(shè)置意向鎖可防止另一個事務(wù)隨后在包含那一頁的表上獲取排它 (X) 鎖。意向鎖可以提高性能,因為 SQL Server 僅在表級檢查意向鎖來確定事務(wù)是否可以安全地獲取該表上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務(wù)是否可以鎖定整個表。

意向鎖包括意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。

鎖模式 描述

意向共享 (IS) 通過在各資源上放置 S 鎖,表明事務(wù)的意向是讀取層次結(jié)構(gòu)中的部分(而不是全部)底層資源。

意向排它 (IX) 通過在各資源上放置 X 鎖,表明事務(wù)的意向是修改層次結(jié)構(gòu)中的部分(而不是全部)底層資源。IX 是 IS 的超集。

與意向排它共享 (SIX) 通過在各資源上放置 IX 鎖,表明事務(wù)的意向是讀取層次結(jié)構(gòu)中的全部底層資源并修改部分(而不是全部)底層資源。允許頂層資源上的并發(fā) IS 鎖。例如,表的 SIX 鎖在表上放置一個 SIX 鎖(允許并發(fā) IS 鎖),在當前所修改頁上放置 IX 鎖(在已修改行上放置 X 鎖)。雖然每個資源在一段時間內(nèi)只能有一個 SIX 鎖,以防止其它事務(wù)對資源進行更新,但是其它事務(wù)可以通過獲取表級的 IS 鎖來讀取層次結(jié)構(gòu)中的底層資源。

獨占鎖:只允許進行鎖定操作的程序使用,其他任何對他的操作均不會被接受。執(zhí)行數(shù)據(jù)更新命令時,SQL Server會自動使用獨占鎖。當對象上有其他鎖存在時,無法對其加獨占鎖。

共享鎖:共享鎖鎖定的資源可以被其他用戶讀取,但其他用戶無法修改它,在執(zhí)行Select時,SQL Server會對對象加共享鎖。

更新鎖:當SQL Server準備更新數(shù)據(jù)時,它首先對數(shù)據(jù)對象作更新鎖鎖定,這樣數(shù)據(jù)將不能被修改,但可以讀取。等到SQL Server確定要進行更新數(shù)據(jù)操作時,他會自動將更新鎖換為獨占鎖,當對象上有其他鎖存在時,無法對其加更新鎖。

2. 從程序員的角度看:分為樂觀鎖和悲觀鎖。

樂觀鎖:完全依靠數(shù)據(jù)庫來管理鎖的工作。

悲觀鎖:程序員自己管理數(shù)據(jù)或?qū)ο笊系逆i處理。

MS-SQLSERVER 使用鎖在多個同時在數(shù)據(jù)庫內(nèi)執(zhí)行修改的用戶間實現(xiàn)悲觀并發(fā)控制

三 鎖的粒度

鎖粒度是被封鎖目標的大小,封鎖粒度小則并發(fā)性高,但開銷大,封鎖粒度大則并發(fā)性低但開銷小

SQL Server支持的鎖粒度可以分為為行、頁、鍵、鍵范圍、索引、表或數(shù)據(jù)庫獲取鎖

資源 描述

RID 行標識符。用于單獨鎖定表中的一行。

鍵 索引中的行鎖。用于保護可串行事務(wù)中的鍵范圍。

頁 8 千字節(jié) (KB) 的數(shù)據(jù)頁或索引頁。

擴展盤區(qū) 相鄰的八個數(shù)據(jù)頁或索引頁構(gòu)成的一組。

表 包括所有數(shù)據(jù)和索引在內(nèi)的整個表。

DB 數(shù)據(jù)庫。

四 鎖定時間的長短

鎖保持的時間長度為保護所請求級別上的資源所需的時間長度。

用于保護讀取操作的共享鎖的保持時間取決于事務(wù)隔離級別。采用 READ COMMITTED 的默認事務(wù)隔離級別時,只在讀取頁的期間內(nèi)控制共享鎖。在掃描中,直到在掃描內(nèi)的下一頁上獲取鎖時才釋放鎖。如果指定 HOLDLOCK 提示或者將事務(wù)隔離級別設(shè)置為 REPEATABLE READ 或 SERIALIZABLE,則直到事務(wù)結(jié)束才釋放鎖。

根據(jù)為游標設(shè)置的并發(fā)選項,游標可以獲取共享模式的滾動鎖以保護提取。當需要滾動鎖時,直到下一次提取或關(guān)閉游標(以先發(fā)生者為準)時才釋放滾動鎖。但是,如果指定 HOLDLOCK,則直到事務(wù)結(jié)束才釋放滾動鎖。

用于保護更新的排它鎖將直到事務(wù)結(jié)束才釋放。

如果一個連接試圖獲取一個鎖,而該鎖與另一個連接所控制的鎖沖突,則試圖獲取鎖的連接將一直阻塞到:

將沖突鎖釋放而且連接獲取了所請求的鎖。

連接的超時間隔已到期。默認情況下沒有超時間隔,但是一些應(yīng)用程序設(shè)置超時間隔以防止無限期等待

五 SQL Server 中鎖的自定義

1 處理死鎖和設(shè)置死鎖優(yōu)先級

死鎖就是多個用戶申請不同封鎖,由于申請者均擁有一部分封鎖權(quán)而又等待其他用戶擁有的部分封鎖而引起的無休止的等待

可以使用SET DEADLOCK_PRIORITY控制在發(fā)生死鎖情況時會話的反應(yīng)方式。如果兩個進程都鎖定數(shù)據(jù),并且直到其它進程釋放自己的鎖時,每個進程才能釋放自己的鎖,即發(fā)生死鎖情況。

2 處理超時和設(shè)置鎖超時持續(xù)時間。

@@LOCK_TIMEOUT 返回當前會話的當前鎖超時設(shè)置,單位為毫秒

SET LOCK_TIMEOUT 設(shè)置允許應(yīng)用程序設(shè)置語句等待阻塞資源的最長時間。當語句等待的時間大于 LOCK_TIMEOUT 設(shè)置時,系統(tǒng)將自動取消阻塞的語句,并給應(yīng)用程序返回"已超過了鎖請求超時時段"的 1222 號錯誤信息

示例

下例將鎖超時期限設(shè)置為 1,800 毫秒。

SET LOCK_TIMEOUT 1800

3) 設(shè)置事務(wù)隔離級別。

4 ) 對 SELECT、INSERT、UPDATE 和 DELETE 語句使用表級鎖定提示。

5) 配置索引的鎖定粒度

可以使用 sp_indexoption 系統(tǒng)存儲過程來設(shè)置用于索引的鎖定粒度

六 查看鎖的信息

1 執(zhí)行 EXEC SP_LOCK 報告有關(guān)鎖的信息

2 查詢分析器中按Ctrl+2可以看到鎖的信息

七 使用注意事項

如何避免死鎖

1 使用事務(wù)時,盡量縮短事務(wù)的邏輯處理過程,及早提交或回滾事務(wù);

2 設(shè)置死鎖超時參數(shù)為合理范圍,如:3分鐘-10分種;超過時間,自動放棄本次操作,避免進程懸掛;

3 優(yōu)化程序,檢查并避免死鎖現(xiàn)象出現(xiàn);

4 .對所有的腳本和SP都要仔細測試,在正是版本之前。

5 所有的SP都要有錯誤處理(通過@error)

6 一般不要修改SQL SERVER事務(wù)的默認級別。不推薦強行加鎖

解決問題 如何對行 表 數(shù)據(jù)庫加鎖

八 幾個有關(guān)鎖的問題

1 如何鎖一個表的某一行

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM table ROWLOCK WHERE id = 1

2 鎖定數(shù)據(jù)庫的一個表

SELECT * FROM table WITH (HOLDLOCK)

加鎖語句:

sybase:

update 表 set col1=col1 where 1=0 ;

MSSQL:

select col1 from 表 (tablockx) where 1=0 ;

oracle:

LOCK TABLE 表 IN EXCLUSIVE MODE ;

加鎖后其它人不可操作,直到加鎖用戶解鎖,用commit或rollback解鎖

幾個例子幫助大家加深印象

設(shè)table1(A,B,C)

A B C

a1 b1 c1

a2 b2 c2

a3 b3 c3

1)排它鎖

新建兩個連接

在第一個連接中執(zhí)行以下語句

begin tran

update table1

set A='aa'

where B='b2'

waitfor delay '00:00:30' --等待30秒

commit tran

在第二個連接中執(zhí)行以下語句

begin tran

select * from table1

where B='b2'

commit tran

若同時執(zhí)行上述兩個語句,則select查詢必須等待update執(zhí)行完畢才能執(zhí)行即要等待30秒

2)共享鎖

在第一個連接中執(zhí)行以下語句

begin tran

select * from table1 holdlock -holdlock人為加鎖

where B='b2'

waitfor delay '00:00:30' --等待30秒

commit tran

在第二個連接中執(zhí)行以下語句

begin tran

select A,C from table1

where B='b2'

update table1

set A='aa'

where B='b2'

commit tran

若同時執(zhí)行上述兩個語句,則第二個連接中的select查詢可以執(zhí)行

而update必須等待第一個事務(wù)釋放共享鎖轉(zhuǎn)為排它鎖后才能執(zhí)行 即要等待30秒

3)死鎖

增設(shè)table2(D,E)

D E

d1 e1

d2 e2

在第一個連接中執(zhí)行以下語句

begin tran

update table1

set A='aa'

where B='b2'

waitfor delay '00:00:30'

update table2

set D='d5'

where E='e1'

commit tran

在第二個連接中執(zhí)行以下語句

begin tran

update table2

set D='d5'

where E='e1'

waitfor delay '00:00:10'

update table1

set A='aa'

where B='b2'

commit tran

同時執(zhí)行,系統(tǒng)會檢測出死鎖,并中止進程

補充一點:

Sql Server2000支持的表級鎖定提示

HOLDLOCK 持有共享鎖,直到整個事務(wù)完成,應(yīng)該在被鎖對象不需要時立即釋放,等于SERIALIZABLE事務(wù)隔離級別

NOLOCK 語句執(zhí)行時不發(fā)出共享鎖,允許臟讀 ,等于 READ UNCOMMITTED事務(wù)隔離級別

PAGLOCK 在使用一個表鎖的地方用多個頁鎖

READPAST 讓sql server跳過任何鎖定行,執(zhí)行事務(wù),適用于READ UNCOMMITTED事務(wù)隔離級別只跳過RID鎖,不跳過頁,區(qū)域和表鎖

ROWLOCK 強制使用行鎖

TABLOCKX 強制使用獨占表級鎖,這個鎖在事務(wù)期間阻止任何其他事務(wù)使用這個表

UPLOCK 強制在讀表時使用更新而不用共享鎖

應(yīng)用程序鎖:

應(yīng)用程序鎖就是客戶端代碼生成的鎖,而不是sql server本身生成的鎖

處理應(yīng)用程序鎖的兩個過程

sp_getapplock 鎖定應(yīng)用程序資源

sp_releaseapplock 為應(yīng)用程序資源解鎖

注意: 鎖定數(shù)據(jù)庫的一個表的區(qū)別

SELECT * FROM table WITH (HOLDLOCK) 其他事務(wù)可以讀取表,但不能更新刪除

SELECT * FROM table WITH (TABLOCKX) 其他事務(wù)不能讀取表,更新和刪除

參考資料:


標題名稱:sqlserver鎖設(shè)置,sql server 鎖表和解鎖
標題網(wǎng)址:http://weahome.cn/article/hdihph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部