鎖定和阻塞

2021-09-06 18:47:39 字數 2828 閱讀 5528

鎖是事務獲取的一種控制資源,用於保護資料資源,防止其它事務對資料進行衝突的或不相容的訪問。我們目前只要學習兩種基本的鎖模式就可以,它們分別是共享鎖和排他鎖。

共享鎖主要是在讀操作時使用,讀操作一旦完成,資料庫就會立即釋放資源上的共享鎖,而且多個事務可以同時持有同一資料資源上的共享鎖。而排他鎖主要是在修改資料時使用,一旦授予,事務將一直持有排他鎖,直到事務完成(提交或回滾)。對於同一資料資源,如果有其他事務已經獲取了該資源的任何型別的鎖,就不能再獲取該資源的排他鎖,如果有其他事務已經獲得了該資源的排他鎖,就不能再獲取該資源的任何型別的鎖。

下面用乙個示例來對其進行演示。首先開啟乙個會話 connection 1,開啟乙個事務,對production.products表的一行進行更新,為產品2的當前單價19.00增加1.00,為了修改這一行,會話必須先獲得乙個排他鎖。如下**。

use

tsqlfundamentals2008;

go--

connection 1,修改資料獲取排他鎖

begin

tran

--開啟事務,但沒有commit,所以該會話會一直持有排他鎖

update production.products set unitprice+=

1.00

where productid=

2;

因為這個事務沒有完成(沒有提交或回滾),所以該會話會一直持有排他鎖。此時再開啟乙個會話connection 2,試圖去查詢這一行資料,為了讀操作這個會話需要乙個共享鎖,但是這一行已經被前面那個會話的排他鎖鎖定,而且共享鎖和排他鎖是不相容的,所以會話connection 2會被阻塞,進入等待狀態。如下**。

use

tsqlfundamentals2008;

go--

connection 2,查詢資料獲取共享鎖

--因為這一行已經被會話connection 1所持有的排他鎖鎖定,而排他鎖和共享鎖是不相容的,所以該會話會被阻塞

select

*from

production.products

where productid=

2;

如果發生了這樣的鎖定和阻塞,我們就會想辦法去分析和排除這種阻塞,為此,我們可以通過一些動態管理物件來得到關於鎖的詳細資訊。如下**。

use

tsqlfundamentals2008;

go--

connection 3

--1,通過動態管理檢視sys.dm_tran_locks檢視該資料庫阻塞鏈中程序的資訊

select request_session_id as spid, --

會話id

resource_type as restype, --

資源型別

resource_database_id as dbid, --

資料庫id

db_name(resource_database_id) as dbname, --

資料庫名稱

resource_description as res,--

資源描述

resource_associated_entity_id as resid,--

資源相關聯實體的id

request_mode as mode,--

鎖模式 request_status as status --

鎖狀態from

sys.dm_tran_locks;

--2,通過動態管理檢視sys.dm_exec_connections檢視阻塞鏈中程序關聯的聯接資訊

--比如聯接建立的時間,最後一次發生讀操作和寫操作的時間以及最後執行的sql**

select session_id as

spid,

connect_time

asconnecttime,

last_read,

last_write,

text

from

sys.dm_exec_connections

stwhere session_id in(52,54

);--

3,通過動態管理檢視sys.dm_exec_sessions找到更多有用的資訊

--包括登入的使用者名稱,主機名和登入時間,最後請求開始時間和最後請求結束時間

select session_id as

spid,

login_time,

host_name

, program_name,

nt_user_name,

last_request_start_time,

last_request_end_time

from

sys.dm_exec_sessions

where session_id in(52,54

);--

4,可通過動態管理檢視sys.dm_exec_requests查詢到導致阻塞的程序的詳細資訊

select session_id as

spid,

blocking_session_id,

command,

sql_handle,

database_id,

wait_type,

wait_time,

wait_resource

from

sys.dm_exec_requests

where blocking_session_id>0;

--利用kill命令終止導致阻塞的程序

--該操作會導致connection 1中的事務回滾

kill

51;

鎖定和阻塞

1.鎖 鎖是事務獲取的一種控制資源,用於資料資源,防止其他事務對資料進行衝突的或不相容的訪問。鎖模式及其相容性 排他鎖 exclusive lock 共享鎖 shared lock 還有一些其他型別的鎖 更新鎖,意向鎖 架構鎖 當試圖修改資料時,事務會為所依賴的資料資源請求排他鎖,一旦授予,事務將一...

阻塞和非阻塞

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...

阻塞和非阻塞

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...