SQL SERVER性能分析--死锁检测数据库阻塞语句
作者:网络转载 发布时间:[ 2013/10/24 10:06:56 ] 推荐标签:
处理方法:
法一:
--连接窗口2
begin tran
select * from ta with (nolock)--用nolock:业务数据不断变化中,如销售查看当月时可用。
法二:
阻塞2(索引):
处理方法: 加索引
create index IX_Ta_Col1 on Ta(Col1)--用COl1列上创索引,当更新时条件:COl1=102会用到索引IX_Ta_Col1上得到一个排它键的范围锁
----------------------------连接窗口1 -------------------------------------------------
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
--针对会话设置了 TRANSACTION ISOLATION LEVEL
--SERIALIZABLE 幻影读、不可重复读和脏读都不允许
begin tran
update ta set col2='BB' where COl1=102
--rollback tran
-----------------------------连接窗口2------------------------------------------------
begin tran
select * from ta
法三:设置当前查询隔离级别
-----------------------------连接窗口2------------------------------------------------
SET TRANSACTION ISOLATION LEVEL READ COMMITTED --设置会话已提交读:指定语句不能读取已由其他事务修改但尚未提交的数据
begin tran
select * from ta
1、事务要尽量短
--查看死锁牺牲品
SELECT '进程ID[SPID]' = STR(a.spid, 4)
, '进程状态' = CONVERT(CHAR(10), a.status)
, '分块进程ID' = STR(a.blocked, 2)
, '服务器名称' = CONVERT(CHAR(10), a.hostname)
, '执行用户' = CONVERT(CHAR(10), SUSER_NAME(a.uid))
, '数据库名' = CONVERT(CHAR(10), DB_NAME(a.dbid))
, '应用程序名' = CONVERT(CHAR(10), a.program_name)
, '正在执行的命令' = CONVERT(CHAR(16), a.cmd)
, '累计CPU时间' = STR(a.cpu, 7)
, 'IO' = STR(a.physical_io, 7)
, '登录名' = a.loginame
, '执行sql' = b.text
FROM master..sysprocesses a CROSS APPLY
sys.dm_exec_sql_text(a.sql_handle) b
WHERE blocked <> 0
ORDER BY spid
--查看进程运行状况
SELECT '进程ID' = STR(spid, 4)
, '进程ID状态' = CONVERT(CHAR(10), status)
, '分块进程ID' = STR(blocked, 2)
, '工作站名称' = CONVERT(CHAR(10), hostname)
, '执行用户' = CONVERT(CHAR(10), SUSER_NAME(uid))
, '数据库名' = CONVERT(CHAR(10), DB_NAME(dbid))
, '应用程序名' = CONVERT(CHAR(10), program_name)
, '正在执行的命令' = CONVERT(CHAR(16), cmd)
, '累计CPU时间' = STR(cpu, 7)
, 'IO' = STR(physical_io, 7)
, '登录名' = loginame
FROM master..sysprocesses
--where blocked = 0
ORDER BY spid
--blocked = 0表示没有阻塞的进程ID;
--查询锁类型
select 进程id=a.req_spid
,数据库=db_name(rsc_dbid)
,类型=case rsc_type when 1 then 'NULL 资源(未使用)'
when 2 then '数据库'
when 3 then '文件'
when 4 then '索引'
when 5 then '表'
when 6 then '页'
when 7 then '键'
when 8 then '扩展盘区'
when 9 then 'RID(行 ID)'
when 10 then '应用程序'
end
,对象id=rsc_objid
,对象名=b.obj_name
,rsc_indid
from master..syslockinfo a left join #t b on a.req_spid=b.req_spid

sales@spasvo.com