西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程數(shù)據(jù)庫教程 → SQL事務(wù)阻塞分析

SQL事務(wù)阻塞分析

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:本站整理時(shí)間:2010/9/16 17:53:32字體大小:A-A+

作者:中國風(fēng)(Roy)點(diǎn)擊:89次評(píng)論:1次標(biāo)簽: SQL

  • 類型:電子教程大。8.5M語言:中文 評(píng)分:8.3
  • 標(biāo)簽:
立即下載

--阻塞
/***********************************************************************************************************************
阻塞:其中一個(gè)事務(wù)阻塞,其它事務(wù)等待對(duì)方釋放它們的鎖,同時(shí)會(huì)導(dǎo)致死鎖問題。

--生成測試表Ta
if not object_id('Ta') is null
drop table Ta
go
create table Ta(ID int Primary key,Col1 int,Col2 nvarchar(10))
insert Ta
select 1,101,'A' union all
select 2,102,'B' union all
select 3,103,'C'
go
生成數(shù)據(jù):
/*
表Ta
ID Col1 Col2
----------- ----------- ----------
1 101 A
2 102 B
3 103 C

(3 行受影響)
*/

將處理阻塞減到最少:
1、事務(wù)要盡量短
2、不要在事務(wù)中請求用戶輸入
3、在讀數(shù)據(jù)考慮便用行版本管理
4、在事務(wù)中盡量訪問最少量的數(shù)據(jù)
5、盡可能地使用低的事務(wù)隔離級(jí)別

go
阻塞1(事務(wù)):
--測試單表

-----------------------------連接窗口1(update\insert\delete)----------------------
begin tran
--update
update ta set col2='BB' where ID=2
--或insert
begin tran
insert Ta values(4,104,'D')
--或delete
begin tran
delete ta where ID=1

--rollback tran

------------------------------------------連接窗口2--------------------------------
begin tran
select * from ta

--rollback tran

--------------分析-----------------------
select
request_session_id as spid,
resource_type,
db_name(resource_database_id) as dbName,
resource_description,
resource_associated_entity_id,
request_mode as mode,
request_status as Status
from
sys.dm_tran_locks
/*
spid resource_type dbName resource_description resource_associated_entity_id mode Status
----------- ------------- ------ -------------------- ----------------------------- ----- ------
55 DATABASE Test 0 S GRANT NULL
54 DATABASE Test 0 S GRANT NULL
53 DATABASE Test 0 S GRANT NULL
55 PAGE Test 1:201 72057594040483840 IS GRANT
54 PAGE Test 1:201 72057594040483840 IX GRANT
55 OBJECT Test 1774629365 IS GRANT NULL
54 OBJECT Test 1774629365 IX GRANT NULL
54 KEY Test (020068e8b274) 72057594040483840 X GRANT --(spID:54請求了排它鎖)
55 KEY Test (020068e8b274) 72057594040483840 S WAIT --(spID:55共享鎖+等待狀態(tài))
(9 行受影響)
*/

--查連接住信息(spid:54、55)
select connect_time,last_read,last_write,most_recent_sql_handle
from sys.dm_exec_connections where session_id in(54,55)

--查看會(huì)話信息
select login_time,host_name,program_name,login_name,last_request_start_time,last_request_end_time
from sys.dm_exec_sessions where session_id in(54,55)

--查看阻塞正在執(zhí)行的請求
select
session_id,blocking_session_id,wait_type,wait_time,wait_resource
from
sys.dm_exec_requests
where
blocking_session_id>0--正在阻塞請求的會(huì)話的 ID。如果此列是 NULL,則不會(huì)阻塞請求

--查看正在執(zhí)行的SQL語句

select
a.session_id,sql.text,a.most_recent_sql_handle
from
sys.dm_exec_connections a
cross apply
sys.dm_exec_sql_text(a.most_recent_sql_handle) as SQL --也可用函數(shù)fn_get_sql通過most_recent_sql_handle得到執(zhí)行語句
where
a.Session_id in(54,55)
/*
session_id text
----------- -----------------------------------------------
54 begin tran update ta set col2='BB' where ID=2
55 begin tran select * from ta
*/

處理方法:
--連接窗口2
begin tran
select * from ta with (nolock)--用nolock:業(yè)務(wù)數(shù)據(jù)不斷變化中,如銷售查看當(dāng)月時(shí)可用。





阻塞2(索引):

-----------------------連接窗口1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --針對(duì)會(huì)話設(shè)置了 TRANSACTION ISOLATION LEVEL
begin tran
update ta set col2='BB' where COl1=102

--rollback tran



------------------------連接窗口2
insert into ta(ID,Col1,Col2) values(5,105,'E')



處理方法:

create index IX_Ta_Col1 on Ta(Col1)--用COl1列上創(chuàng)索引,當(dāng)更新時(shí)條件:COl1=102會(huì)用到索引IX_Ta_Col1上得到一個(gè)排它鍵的范圍鎖



阻塞3(會(huì)話設(shè)置):

-------------------------------連接窗口1

begin tran
--update
update ta set col2='BB' where ID=2
select col2 from ta where ID=2

--rollback tran

--------------------------------連接窗口2

SET TRANSACTION ISOLATION LEVEL READ COMMITTED --設(shè)置會(huì)話已提交讀:指定語句不能讀取已由其他事務(wù)修改但尚未提交的數(shù)據(jù)
begin tran
select * from ta



處理方法:
--------------------------------連接窗口2(善用會(huì)話設(shè)置:業(yè)務(wù)數(shù)據(jù)不斷變化中,如銷售查看當(dāng)月時(shí)可用)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --設(shè)置會(huì)話未提交讀:指定語句可以讀取已由其他事務(wù)修改但尚未提交的行
begin tran
select * from ta

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)