zoukankan      html  css  js  c++  java
  • locks, blocking, dead lock, session, connection and request

    -- Listing 8.2 Creating the sample database and table

    CREATE DATABASE IWS_Temp
    GO

    USE IWS_Temp

    CREATE TABLE [dbo].[tblCountry](
    [CountryId] [int] IDENTITY(1,1) NOT NULL,
    [Code] [char](3) NOT NULL,
    [Description] [varchar](50) NOT NULL)

    -- Listing 8.3 Starting an open transaction

    USE IWS_TEMP

    BEGIN TRANSACTION

    INSERT INTO [dbo].[tblCountry] ([Code], [Description])
    VALUES('ENG', 'ENGLAND')

    -- Listing 8.4 Selecting data from a table that has an open transaction against it

    USE IWS_TEMP

    SELECT * FROM [dbo].[tblCountry]


    -- Listing 8.5 Observing the current locks

    SELECT DB_NAME(resource_database_id) AS DatabaseName, request_session_id
    , resource_type, request_status, request_mode
    FROM sys.dm_tran_locks
    WHERE request_session_id !=@@spid
    ORDER BY request_session_id


    -- Listing 8.6 Template for handling deadlock retries

    DECLARE @CurrentTry INT = 1
    DECLARE @MaxRetries INT = 3
    DECLARE @Complete BIT = 0

    WHILE (@Complete = 0)
    BEGIN
    BEGIN TRY
    EXEC dbo.SomeRoutine
    SET @Complete = 1
    END TRY
    BEGIN CATCH
    DECLARE @ErrorNum INT
    DECLARE @ErrorMessage NVARCHAR(4000)
    DECLARE @ErrorState INT
    DECLARE @ErrorSeverity INT

    SET @ErrorNum = ERROR_NUMBER()
    SET @ErrorMessage = ERROR_MESSAGE()
    SET @ErrorState = ERROR_STATE()
    SET @ErrorSeverity = ERROR_SEVERITY()

    IF (@ErrorNum = 1205) AND (@CurrentTry < @MaxRetries)
    BEGIN
    IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION
    SET @CurrentTry = @CurrentTry + 1
    WAITFOR DELAY '00:00:10'
    END
    ELSE
    BEGIN
    IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION
    SET @Complete = 1
    RAISERROR ('An error has occurred'
    , @ErrorSeverity
    , @ErrorState)
    END
    END CATCH
    END

    -- Listing 8.7 Information contained in sessions, connections, and requests

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT *
    FROM sys.dm_exec_sessions s
    LEFT OUTER JOIN sys.dm_exec_connections c
    ON s.session_id = c.session_id
    LEFT OUTER JOIN sys.dm_exec_requests r
    ON c.connection_id = r.connection_id
    WHERE s.session_id > 50

    -- Listing 8.8 How to discover which locks are currently held

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT DB_NAME(resource_database_id) AS DatabaseName
    , request_session_id
    , resource_type
    , CASE
    WHEN resource_type = 'OBJECT'
    THEN OBJECT_NAME(resource_associated_entity_id)
    WHEN resource_type IN ('KEY', 'PAGE', 'RID')
    THEN (SELECT OBJECT_NAME(OBJECT_ID)
    FROM sys.partitions p
    WHERE p.hobt_id = l.resource_associated_entity_id)
    END AS resource_type_name
    , request_status
    , request_mode
    FROM sys.dm_tran_locks l
    WHERE request_session_id !=@@spid
    ORDER BY request_session_id


    -- Listing 8.9 How to identify contended resources

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT
    tl1.resource_type,
    DB_NAME(tl1.resource_database_id) AS DatabaseName,
    tl1.resource_associated_entity_id,
    tl1.request_session_id,
    tl1.request_mode,
    tl1.request_status
    , CASE
    WHEN tl1.resource_type = 'OBJECT'
    THEN OBJECT_NAME(tl1.resource_associated_entity_id)
    WHEN tl1.resource_type IN ('KEY', 'PAGE', 'RID')
    THEN (SELECT OBJECT_NAME(OBJECT_ID)
    FROM sys.partitions s
    WHERE s.hobt_id = tl1.resource_associated_entity_id)
    END AS resource_type_name
    FROM sys.dm_tran_locks as tl1
    INNER JOIN sys.dm_tran_locks as tl2
    ON tl1.resource_associated_entity_id = tl2.resource_associated_entity_id
    AND tl1.request_status <> tl2.request_status
    AND (tl1.resource_description = tl2.resource_description
    OR (tl1.resource_description IS NULL
    AND tl2.resource_description IS NULL))
    ORDER BY tl1.resource_associated_entity_id, tl1.request_status


    -- Listing 8.10 How to identify contended resources, including SQL query details

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT
    tl1.resource_type
    , DB_NAME(tl1.resource_database_id) AS DatabaseName
    , tl1.resource_associated_entity_id
    , tl1.request_session_id
    , tl1.request_mode
    , tl1.request_status
    , CASE
    WHEN tl1.resource_type = 'OBJECT'
    THEN OBJECT_NAME(tl1.resource_associated_entity_id)
    WHEN tl1.resource_type IN ('KEY', 'PAGE', 'RID')
    THEN (SELECT OBJECT_NAME(OBJECT_ID)
    FROM sys.partitions s
    WHERE s.hobt_id = tl1.resource_associated_entity_id)
    END AS resource_type_name
    , t.text AS [Parent Query]
    , SUBSTRING (t.text,(r.statement_start_offset/2) + 1,
    ((CASE WHEN r.statement_end_offset = -1
    THEN LEN(CONVERT(NVARCHAR(MAX), t.text)) * 2
    ELSE r.statement_end_offset
    END - r.statement_start_offset)/2) + 1) AS [Individual Query]
    FROM sys.dm_tran_locks as tl1
    INNER JOIN sys.dm_tran_locks as tl2
    ON tl1.resource_associated_entity_id = tl2.resource_associated_entity_id
    AND tl1.request_status <> tl2.request_status
    AND (tl1.resource_description = tl2.resource_description
    OR (tl1.resource_description IS NULL
    AND tl2.resource_description IS NULL))
    INNER JOIN sys.dm_exec_connections c
    ON tl1.request_session_id = c.most_recent_session_id
    CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t
    LEFT OUTER JOIN sys.dm_exec_requests r ON c.connection_id = r.connection_id
    ORDER BY tl1.resource_associated_entity_id, tl1.request_status

    -- Listing 8.11 How to find an idle session with an open transaction

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT es.session_id, es.login_name, es.host_name, est.text
    , cn.last_read, cn.last_write, es.program_name
    FROM sys.dm_exec_sessions es
    INNER JOIN sys.dm_tran_session_transactions st
    ON es.session_id = st.session_id
    INNER JOIN sys.dm_exec_connections cn
    ON es.session_id = cn.session_id
    CROSS APPLY sys.dm_exec_sql_text(cn.most_recent_sql_handle) est
    LEFT OUTER JOIN sys.dm_exec_requests er
    ON st.session_id = er.session_id
    AND er.session_id IS NULL

    -- Listing 8.12 What’s being blocked by idle sessions with open transactions

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT
    Waits.wait_duration_ms / 1000 AS WaitInSeconds
    , Blocking.session_id as BlockingSessionId
    , DB_NAME(Blocked.database_id) AS DatabaseName
    , Sess.login_name AS BlockingUser
    , Sess.host_name AS BlockingLocation
    , BlockingSQL.text AS BlockingSQL
    , Blocked.session_id AS BlockedSessionId
    , BlockedSess.login_name AS BlockedUser
    , BlockedSess.host_name AS BlockedLocation
    , BlockedSQL.text AS BlockedSQL
    , SUBSTRING (BlockedSQL.text, (BlockedReq.statement_start_offset/2) + 1,
    ((CASE WHEN BlockedReq.statement_end_offset = -1
    THEN LEN(CONVERT(NVARCHAR(MAX), BlockedSQL.text)) * 2
    ELSE BlockedReq.statement_end_offset
    END - BlockedReq.statement_start_offset)/2) + 1)
    AS [Blocked Individual Query]
    , Waits.wait_type
    FROM sys.dm_exec_connections AS Blocking
    INNER JOIN sys.dm_exec_requests AS Blocked
    ON Blocking.session_id = Blocked.blocking_session_id
    INNER JOIN sys.dm_exec_sessions Sess
    ON Blocking.session_id = sess.session_id
    INNER JOIN sys.dm_tran_session_transactions st
    ON Blocking.session_id = st.session_id
    LEFT OUTER JOIN sys.dm_exec_requests er
    ON st.session_id = er.session_id
    AND er.session_id IS NULL
    INNER JOIN sys.dm_os_waiting_tasks AS Waits
    ON Blocked.session_id = Waits.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle)AS BlockingSQL
    INNER JOIN sys.dm_exec_requests AS BlockedReq
    ON Waits.session_id = BlockedReq.session_id
    INNER JOIN sys.dm_exec_sessions AS BlockedSess
    ON Waits.session_id = BlockedSess.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
    ORDER BY WaitInSeconds

    -- Listing 8.13 What’s blocked by active sessions with open transactions

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT
    Waits.wait_duration_ms / 1000 AS WaitInSeconds
    , Blocking.session_id as BlockingSessionId
    , DB_NAME(Blocked.database_id) AS DatabaseName
    , Sess.login_name AS BlockingUser
    , Sess.host_name AS BlockingLocation
    , BlockingSQL.text AS BlockingSQL
    , Blocked.session_id AS BlockedSessionId
    , BlockedSess.login_name AS BlockedUser
    , BlockedSess.host_name AS BlockedLocation
    , BlockedSQL.text AS BlockedSQL
    , SUBSTRING (BlockedSQL.text, (BlockedReq.statement_start_offset/2) + 1,
    ((CASE WHEN BlockedReq.statement_end_offset = -1
    THEN LEN(CONVERT(NVARCHAR(MAX), BlockedSQL.text)) * 2
    ELSE BlockedReq.statement_end_offset
    END - BlockedReq.statement_start_offset)/2) + 1)
    AS [Blocked Individual Query]
    , Waits.wait_type
    FROM sys.dm_exec_connections AS Blocking
    INNER JOIN sys.dm_exec_requests AS Blocked
    ON Blocking.session_id = Blocked.blocking_session_id
    INNER JOIN sys.dm_exec_sessions Sess
    ON Blocking.session_id = sess.session_id
    INNER JOIN sys.dm_tran_session_transactions st
    ON Blocking.session_id = st.session_id
    INNER JOIN sys.dm_exec_requests er
    ON st.session_id = er.session_id
    INNER JOIN sys.dm_os_waiting_tasks AS Waits
    ON Blocked.session_id = Waits.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle) AS BlockingSQL
    INNER JOIN sys.dm_exec_requests AS BlockedReq
    ON Waits.session_id = BlockedReq.session_id
    INNER JOIN sys.dm_exec_sessions AS BlockedSess
    ON Waits.session_id = BlockedSess.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
    ORDER BY WaitInSeconds


    -- Listing 8.14 What’s blocked—active and idle sessions with open transactions

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT
    Waits.wait_duration_ms / 1000 AS WaitInSeconds
    , Blocking.session_id as BlockingSessionId
    , DB_NAME(Blocked.database_id) AS DatabaseName
    , Sess.login_name AS BlockingUser
    , Sess.host_name AS BlockingLocation
    , BlockingSQL.text AS BlockingSQL
    , Blocked.session_id AS BlockedSessionId
    , BlockedSess.login_name AS BlockedUser
    , BlockedSess.host_name AS BlockedLocation
    , BlockedSQL.text AS BlockedSQL
    , SUBSTRING (BlockedSQL.text, (BlockedReq.statement_start_offset/2) + 1,
    ((CASE WHEN BlockedReq.statement_end_offset = -1
    THEN LEN(CONVERT(NVARCHAR(MAX), BlockedSQL.text)) * 2
    ELSE BlockedReq.statement_end_offset
    END - BlockedReq.statement_start_offset)/2) + 1)
    AS [Blocked Individual Query]
    , Waits.wait_type
    FROM sys.dm_exec_connections AS Blocking
    INNER JOIN sys.dm_exec_requests AS Blocked
    ON Blocking.session_id = Blocked.blocking_session_id
    INNER JOIN sys.dm_exec_sessions Sess
    ON Blocking.session_id = sess.session_id
    INNER JOIN sys.dm_tran_session_transactions st
    ON Blocking.session_id = st.session_id
    LEFT OUTER JOIN sys.dm_exec_requests er
    ON st.session_id = er.session_id
    INNER JOIN sys.dm_os_waiting_tasks AS Waits
    ON Blocked.session_id = Waits.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle) AS BlockingSQL
    INNER JOIN sys.dm_exec_requests AS BlockedReq
    ON Waits.session_id = BlockedReq.session_id
    INNER JOIN sys.dm_exec_sessions AS BlockedSess
    ON Waits.session_id = BlockedSess.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
    ORDER BY WaitInSeconds

    -- Listing 8.15 What has been blocked for more than 30 seconds

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT
    Waits.wait_duration_ms / 1000 AS WaitInSeconds
    , Blocking.session_id as BlockingSessionId
    , Sess.login_name AS BlockingUser
    , Sess.host_name AS BlockingLocation
    , BlockingSQL.text AS BlockingSQL
    , Blocked.session_id AS BlockedSessionId
    , BlockedSess.login_name AS BlockedUser
    , BlockedSess.host_name AS BlockedLocation
    , BlockedSQL.text AS BlockedSQL
    , DB_NAME(Blocked.database_id) AS DatabaseName
    FROM sys.dm_exec_connections AS Blocking
    INNER JOIN sys.dm_exec_requests AS Blocked
    ON Blocking.session_id = Blocked.blocking_session_id
    INNER JOIN sys.dm_exec_sessions Sess
    ON Blocking.session_id = sess.session_id
    INNER JOIN sys.dm_tran_session_transactions st
    ON Blocking.session_id = st.session_id
    LEFT OUTER JOIN sys.dm_exec_requests er
    ON st.session_id = er.session_id
    AND er.session_id IS NULL
    INNER JOIN sys.dm_os_waiting_tasks AS Waits
    ON Blocked.session_id = Waits.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle) AS BlockingSQL
    INNER JOIN sys.dm_exec_requests AS BlockedReq
    ON Waits.session_id = BlockedReq.session_id
    INNER JOIN sys.dm_exec_sessions AS BlockedSess
    ON Waits.session_id = BlockedSess.session_id
    CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
    WHERE Waits.wait_duration_ms > 30000
    ORDER BY WaitInSeconds


    作者:ChenLuLouis
    出处:http://www.cnblogs.com/chenlulouis/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-chenlulouisBlog

  • 相关阅读:
    Vue部分知识
    JAVA基础之Map接口
    浏览器渲染机制及五大浏览器、四大内核
    WebPack
    Gulp
    GC垃圾回收机制
    Git操作(及操作github)
    Git、Github和GitLab的区别及与SVN的比较
    Node.js介绍
    JAVA基础之Set接口
  • 原文地址:https://www.cnblogs.com/chenlulouis/p/15758206.html
Copyright © 2011-2022 走看看