关闭

处理锁、阻塞和死锁(1)——确定长时间运行的事务

发表于:2013-3-26 10:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:黄钊吉    来源:51Testing软件测试网采编

  前言:

  事务是OLTP系统中的主要部分。它管理数据一致性和数据并发问题,当多个资源同时被读取或者修改相同数据时,SQLServer会通过锁定机制来确保数据库中的数据总是处于一个有效状态。在SQLServer中,锁管理器是负责实现这些锁机制。SQLServer对于不同的资源类型提供不同的锁类型,如数据库、文件、对象、表、区、页和键。

  当你使用事务时,依然会遇到由事务引起的问题,这些通常是由于锁、阻塞和死锁引起的。

  本系列将讲解这三部分的概念。

  确定长时间运行的事务:

  长时间运行的事务会阻塞其他事务,并且引发新一轮的长时间运行事务!这将严重影响数据库服务器的性能。

  作为DBA,你需要经常监控服务器的事务,当你发现有长运行的事务时,需要使用必须的步骤纠正。本文将讲解通过事务的持续时间去监控这些事务,如果经常找到一些事务持续时间很长,你可能需要查找是否被其他事务阻塞了,或者深入研究事务的语句是否有问题。

  准备工作

  本文使用SQLServer2012的示例数据库AdventureWorks2012数据库。

  步骤:

  1、打开SQLServer,连接到AdventureWorks2012数据库。

  2、输入以下脚本,使其开启一个简单的事务:

USE AdventureWorks2012
GO
BEGIN TRANSACTION
SELECT  *
FROM    Sales.SalesOrderHeader

  3、不关闭窗口,在新窗口中输入以下代码,监控当前正在运行的事务:

SELECT  ST.transaction_id AS TransactionID ,
        DB_NAME(DT.database_id) AS DatabaseName ,
        AT.transaction_begin_time AS TransactionStartTime ,
        DATEDIFF(SECOND, AT.transaction_begin_time, GETDATE()) AS TransactionDuration ,
        CASE AT.transaction_type
          WHEN 1 THEN 'Read/Write Transaction'
          WHEN 2 THEN 'Read-Only Transaction'
          WHEN 3 THEN 'System Transaction'
          WHEN 4 THEN 'Distributed Transaction'
        END AS TransactionType ,
        CASE AT.transaction_state
          WHEN 0 THEN 'Transaction Not Initialized'
          WHEN 1 THEN 'Transaction Initialized & Not Started'
          WHEN 2 THEN 'Active Transaction'
          WHEN 3 THEN 'Transaction Ended'
          WHEN 4 THEN 'Distributed Transaction Initiated Commit Process'
          WHEN 5 THEN 'Transaction in Prepared State & Waiting Resolution'
          WHEN 6 THEN 'Transaction Committed'
          WHEN 7 THEN 'Transaction Rolling Back'
          WHEN 8 THEN 'Transaction Rolled Back'
        END AS TransactionState
FROM    sys.dm_tran_session_transactions AS ST
        INNER JOIN sys.dm_tran_active_transactions AS AT ON ST.transaction_id = AT.transaction_id
        INNER JOIN sys.dm_tran_database_transactions AS DT ON ST.transaction_id = DT.transaction_id
ORDER BY TransactionStartTime
GO

  4、下面是结果的截图:

  5、现在来关闭事务,在第一个窗口中输入:

ROLLBACK TRANSACTION
GO

  分析:

  上面例子中先打开一个窗口,然后建立一个新查询。在另外一个窗口中,查询了当前正在运行的事务。

  本例中使用了下面3个DMV:

  1、sys.dm_tran_session_transactions:提供视图相关的信息,并包含了特定会话的信息。

  2、sys.dm_tran_active_transactions:返回实例级别上,所以正在活动的事务信息。

  3、sys.dm_tran_database_transactions:返回数据库级别上的事务信息。

  例子中使用了DB_NAME()来返回当前数据库,作为筛选特定数据库上的事务信息。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号