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

原文:第十六章——处理锁、阻塞和死锁(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()来返回当前数据库,作为筛选特定数据库上的事务信息。

时间: 2024-10-12 15:17:22

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

第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测和处理这类问题. 死锁是当两个或者以上的事务互相阻塞引起的.在这种情况下两个事务会无限期地等待对方释放资源以便操作.下面是死锁的示意图: 本文将使用SQLServer Profiler来跟踪死锁. 准备工作: 为了侦测死锁,我们需要先模拟死锁.本例将使用两个不同的会话创建两个事务. 步骤: 1. 打

第十六章——处理锁、阻塞和死锁(2)——侦测阻塞和阻塞查询

原文:第十六章--处理锁.阻塞和死锁(2)--侦测阻塞和阻塞查询 前言: 如果一个事务正在等待一些给其他事务锁定的资源.这个事务就被成为"被阻塞的事务".反过来,引起阻塞的事务,也就是锁定资源并造成其他事务等待的事务叫做"正在阻塞的事务". 长时间运行事务会阻塞其他事务和查询,使他们等待长时间.在繁重的系统中,很多时候我们会遇到阻塞问题,如果一个事务因为阻塞未完成.会造成一些列的等待链. 本文将介绍如何发现并马上解决这方面的问题. 准备工作: 本例依旧使用SQLSe

《Java并发编程实战》第十六章 Java内存模型 读书笔记

Java内存模型是保障多线程安全的根基,这里仅仅是认识型的理解总结并未深入研究. 一.什么是内存模型,为什么需要它 Java内存模型(Java Memory Model)并发相关的安全发布,同步策略的规范.一致性等都来自于JMM. 1 平台的内存模型 在架构定义的内存模型中将告诉应用程序可以从内存系统中获得怎样的保证,此外还定义了一些特殊的指令(称为内存栅栏或栅栏),当需要共享数据时,这些指令就能实现额外的存储协调保证. JVM通过在适当的位置上插入内存栅栏来屏蔽在JVM与底层平台内存模型之间的

“全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第二十六章:同步方法生产者与消费者线程 下一章 "全栈2019"Java多线程第二十七章:Lock获取lock/释放unlock锁 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorha

“全栈2019”Java多线程第四十六章:判断任意线程是否已持有写锁

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十六章:判断任意线程是否已持有写锁 下一章 "全栈2019"Java多线程第四十七章:判断锁是否为公平锁isFair() 学习小组 加入同步学习小组,共同交流与进步. 方式一:加入编程圈子. 方式二:关注头条号Gorhaf,私信"Java学习小组". 方式三:关

C Primer Plus (第五版) 第十六章 C预处理器和C库 编程练习

第十六章 C预处理器和C库 开发一个包含您需要使用的预处理器定义的头文件 //max.h  #ifndef _MAX_H_     #define _MAX_H_     #define MAX(X, Y) ((X)>(Y)?(X):(Y)) #endif 2.两个数的调和平均数可用如下方法得到:首先对两数的倒数取平均值,最后再取倒数.使用#define指令定义一个宏"函数"执行这个运算.编写一个简单的程序测试该宏. #include <stdio.h> #defin

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

第十六章 多态性

相同函数名具有多态性: ①  译时的多态(由函数名来调用时体现):重载:同类,不同参 ②  运行时的多态(用指向不同类的指针来调用): 覆盖:  不同类,同参,基类有virtual(由指针的类型来决定,体现了多态性) 隐藏:①不同类,同参,基类无virtual②不同类,不同参(不论有无virtual)(由指针来决定,不能体现多态性) 1.  为什么要使用多重继承 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数.C++多态性是通过虚函数(virtual)来实现的. 2.

Gradle 1.12 翻译——第十六章. 使用文件

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41113353 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin