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

前言:

  事务是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()来返回当前数据库,作为筛选特定数据库上的事务信息。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-11 00:41:24

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

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

原文:第十六章--处理锁.阻塞和死锁(1)--确定长时间运行的事务 前言: 事务是OLTP系统中的主要部分.它管理数据一致性和数据并发问题,当多个资源同时被读取或者修改相同数据时,SQLServer会通过锁定机制来确保数据库中的数据总是处于一个有效状态.在SQLServer中,锁管理器是负责实现这些锁机制.SQLServer对于不同的资源类型提供不同的锁类型,如数据库.文件.对象.表.区.页和键. 当你使用事务时,依然会遇到由事务引起的问题,这些通常是由于锁.阻塞和死锁引起的. 本系列将讲解这三

连接池-关于Java服务长时间运行出现各种bug问题,可能运行几天没问题,但是运行十几天就会出现各种bug

问题描述 关于Java服务长时间运行出现各种bug问题,可能运行几天没问题,但是运行十几天就会出现各种bug 服务使用的是ScheduledThreadPoolExecuto定时任务,有使用到全局变量,数据库连接池使用的是c3p0,我感觉出现问题的原因可能就是这三个里哪个导致的,程序是没问题的,就是运行久了就出现各种问题了,而且很莫明奇妙,比如本来是好好的运行久了日志中的中文从那个时刻起往后全都乱码了.请问这是怎么回事? 定时任务: ScheduledThreadPoolExecutor boo

TFS 2010:为什么Team Build长时间运行?

最近一直在使用Visual Studio 2010开发基于Silverligth的项目,并且使用Team Foundation Server作为整个开发过程的管理工具.为了保证开发过程中互相的嵌入不影响彼此,我们配置了Team Build Service,并且使用了Gated Check-in(参考Team Build 2010 – Gated Check-in 拒绝无法编译的代码嵌入了解Gated Check-in)来控制每个人嵌入的代码是可以被Team Build成功编译的.在开始的几天里,

游戏长时间运行很卡怎么办

  在无盘工作站中,运行大型游戏,时间一长就感觉到明显的卡. 这种情况大多是由于虚拟内存的设置小引起的.打开"D:yxzrootwindowssystem.ini",找到"PagingDrive=w",然后把下面两行的数据修改为500M,或者将"MinPagingFileSize=4096"."MinPagingFileSize=307200"两行删除,让系统自动管理虚拟内存.通过这样的修改,游戏长时间运行电脑变卡的情况可以得

android 长时间运行导致程序奔溃

问题描述 android 长时间运行导致程序奔溃 偶发性bug,不知道哪里引起的错误,程序太大没办法贴出代码,请大神帮忙看看是哪里出错了可以给个提示.没调过这方面的bug,请大神教教方法 谢谢了 06-02 13:56:25.920: A/libc(15969): Fatal signal 6 (SIGABRT) at 0x00003e61 (code=-6), thread 15969 (.clov4r.ad.nil1) 06-02 13:56:26.030: I/DEBUG(107): **

fpga-FPGA长时间运行不能正常工作

问题描述 FPGA长时间运行不能正常工作 做了个系统,FPGA工作一两个小时是没任何问题的,但工作时间长了fpga就会出bug,各种不正常工作,而且时间不固定,有时候工作几个小时有时候能几天--

程序奔溃-长时间运行程序出错问题

问题描述 长时间运行程序出错问题 写了一个C#的数据包解析上传的程序,主要逻辑是程序一直对某一端口进行监听(会有收集数据的硬件,并且端口号是手动输入),每当有数据来,就将数据经过xml文档格式进行解析出来,写入远程数据库.现在一直测试1周的情况下,会出现无法上传数据情况,那会用串口助手监听是有数据上传的.请问:如何解决? 解决方案 我以前碰到过这种情况,很可能是内存泄露,每次都有内存没释放,长时间积累就导致崩溃. 这是我用C++出现的情况,不知道对你有用没?

绘图-用GDI画折线图长时间运行之后系统变慢

问题描述 用GDI画折线图长时间运行之后系统变慢 vc2010 mfc自己编写函数画折线图,传入一些离散的点然后绘制到图片控件上,程序刚运行时没有异常,但在较长时间(4小时左右)运行之后整个系统开始变的卡顿(比如打开其他文件变得缓慢),甚至无法绘制图形,程序中的按钮也不能点击,但是程序使用的内存和cpu也都正常,调试的时候绘图函数也有正常执行没有死循环,绘制的点也不多,求高手帮忙解答 解决方案 系统的句柄是否有泄露,造成资源泄漏.gdi资源是否及时释放. 解决方案二: 非常感谢!应该是图片控件使

c#循环File.Copy 长时间运行后电脑蓝屏

问题描述 c#循环File.Copy 长时间运行后电脑蓝屏 While(True){ var sourthPath="";//获取原路径 if(File.Exists(sourthPath)){ var movePath="";//对文件重命名,并移动到新目录 File.Copy(sourthPath,movePath); } } 程序运行半小时或以上电脑就蓝屏了 试过Thread.Sleep,还是会中断, 请问下怎么能让电脑不蓝屏不死机 解决方案 只有驱动级的异常