鎖是事務獲取的一種控制資源,用於保護資料資源,防止其它事務對資料進行衝突的或不相容的訪問。我們目前只要學習兩種基本的鎖模式就可以,它們分別是共享鎖和排他鎖。
共享鎖主要是在讀操作時使用,讀操作一旦完成,資料庫就會立即釋放資源上的共享鎖,而且多個事務可以同時持有同一資料資源上的共享鎖。而排他鎖主要是在修改資料時使用,一旦授予,事務將一直持有排他鎖,直到事務完成(提交或回滾)。對於同一資料資源,如果有其他事務已經獲取了該資源的任何型別的鎖,就不能再獲取該資源的排他鎖,如果有其他事務已經獲得了該資源的排他鎖,就不能再獲取該資源的任何型別的鎖。
下面用乙個示例來對其進行演示。首先開啟乙個會話 connection 1,開啟乙個事務,對production.products表的一行進行更新,為產品2的當前單價19.00增加1.00,為了修改這一行,會話必須先獲得乙個排他鎖。如下**。
usetsqlfundamentals2008;
go--
connection 1,修改資料獲取排他鎖
begin
tran
--開啟事務,但沒有commit,所以該會話會一直持有排他鎖
update production.products set unitprice+=
1.00
where productid=
2;
因為這個事務沒有完成(沒有提交或回滾),所以該會話會一直持有排他鎖。此時再開啟乙個會話connection 2,試圖去查詢這一行資料,為了讀操作這個會話需要乙個共享鎖,但是這一行已經被前面那個會話的排他鎖鎖定,而且共享鎖和排他鎖是不相容的,所以會話connection 2會被阻塞,進入等待狀態。如下**。
usetsqlfundamentals2008;
go--
connection 2,查詢資料獲取共享鎖
--因為這一行已經被會話connection 1所持有的排他鎖鎖定,而排他鎖和共享鎖是不相容的,所以該會話會被阻塞
select
*from
production.products
where productid=
2;
如果發生了這樣的鎖定和阻塞,我們就會想辦法去分析和排除這種阻塞,為此,我們可以通過一些動態管理物件來得到關於鎖的詳細資訊。如下**。
usetsqlfundamentals2008;
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 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...