会话52:
(1)connect_time连接时间:2016-06-07 07:09:41.103
(2)last_read最后一次读操作时间:2016-06-07 07:10:56.233
(3)last_write最后一次写操作时间:2016-06-07 07:10:57.873
(4)most_recent_sql_handle这是一个二进制标记,最后一个SQL批处理
会话56:
(1)状态WAIT-授予锁
(2)正在等待第1个数据文件上的第109页上的第0行资源的排他锁(3)持有第1个数据文件上的第109页资源的排他锁
(3)持有OBJECT资源,排他锁
(4)持有DATABASE资源,排他锁
★ 3.sys.dm_exec_sql_text 表函数
(1)该函数可以将二进制标记most_recent_sql_handle作为参数,然后返回SQL代码。
(2)阻塞进程在不断地运行,所以在代码中看到的最后一个操作不一定是导致问题的语句。在本例中最后一条执行语句是导致阻塞的语句。
查询窗口
服务器进程标识符SPID
执行语句 结果 说明Connection3 57
SELECT session_id , text FROM sys.dm_exec_connections CROSS APPLY sys.dm_exec_sql_text (most_recent_sql_handle) AS ST WHERE session_id IN ( 52, 56 )
会话52:
执行的SQL语句:
BEGIN TRAN UPDATE dbo.myProduct SET price = price + 1 WHERE id = 1
会话56:
执行的SQL语句:
(@1 tinyint) SELECT * FROM [dbo].[myProduct] WHERE [id]=@1
★ 4.sys.dm_exec_sessions 视图
(1)会话建立的时间login_time
(2)特定于会话的客户端工作站名称host_name
(3)初始化会话的客户端程序的名称program_name
(4)会话所使用的SQL Server登录名login_name
(5)最近一次会话请求的开始时间last_request_start_time
(6)最近一次会话请求的完成时间last_request_end_time
查询窗口
服务器进程标识符SPID
执行语句
结果 说明Connection3 57
SELECT * FROM sys.dm_exec_sessions
★ 5.sys.dm_exec_requests 视图
(1)识别出阻塞链涉及到的会话、争用的资源、被阻塞会话等待了多长时间
查询窗口
服务器进程标识符SPID
执行语句
结果 说明Connection3 57
SELECT * FROM sys.dm_exec_sessions
会话56:
(1)被会话52阻塞,blocking_session_id = 52
(2)会话52的开始时间start_time
(3)状态挂起status = suspended
(4)挂起的命令command=select
★ 6.Lock_TIMEOUT 选项
(1)设置会话等待锁释放的超时期限
(2)默认情况下会话不会设置等待锁释放的超时期限
(3)设置会话超时期限为5秒, SET Lock_TIMEOUT 5000
(4)锁定如果超时,不会引发事务回滚
(5)取消会话超时锁定的设置,SET LOCK_TIMEOUT -1
如果超时,将显示以下错误:
★7.KILL <spid> 命令
(1)杀掉会话52,KILL 52
(2)杀掉会话,会引起事务回滚,同时释放排他锁
三、隔离级别 1.基本概念:(1)隔离级别用来做什么
a.隔离级别用于决定如何控制并发用户读写数据的操作
(2)写操作
a.任何对表做出修改的语句
b.使用排他锁
c.不能修改读操作获得的锁和锁的持续时间
(3)读操作:
a.任何检索数据的语句
b.默认使用共享锁
c.使用隔离级别来控制读操作的处理方式
2.隔离级别的分类(1)未提交读 (READ UNCOMMITTED)
(2)已提交读(READ COMMITTED)(默认值)
(3)可重复读(REPEATABLE READ)
(4)可序列化(SERIALIZABLE)
(5)快照(SNAPSHOT)
(6)已经提交读快照(READ_COMMITTED_SNAPSHOT)
3.隔离级别的设置(1)设置整个会话的隔离级别
SET TRANSACTION ISOLATION LEVEL <isolation name>; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
(2)用表提示设置查询的隔离级别
SELECT ... FROM <table> WITH (<isolation name>);
SELECT * FROM dbo.myProduct WITH (READCOMMITTED);
注意:
1.设置会话选项的隔离级别时,隔离级别中的每个单词之间需要用空格分隔
2.用表提示的隔离级别时,隔离级别中的每个单词之间不需要用空格分隔
3.表提示的隔离级别有同义词,如:NOLOCK->READUNCOMMITTED,HOLDLOCK->REPEATABLEREAD
4.隔离级别的严格性:1.未提交读<2.已提交读<3.可重复读<4.可序列化
5.隔离级别越高,一致性越高,并发性越低