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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 原文: 第十六章——处理锁、阻塞和死锁(1)——确定长时间运行的事务 前言: 事务是OLTP系统中的主要部分。它管理数据一致性和数据并发问题,当多个资源同时被读取或者修改相同数据时,SQLServer会通过锁定机制来确保数据库中的数据总是处于一个有效状态。
原文: 第十六章——处理锁、阻塞和死锁(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()来返回当前数据库,作为筛选特定数据库上的事务信息。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4月前
|
消息中间件 算法 Java
(十四)深入并发之线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解
本文深入探讨了并发编程的关键概念和技术挑战。首先介绍了进程、线程、纤程、协程、管程等概念,强调了这些概念是如何随多核时代的到来而演变的,以满足高性能计算的需求。随后,文章详细解释了死锁、活锁与锁饥饿等问题,通过生动的例子帮助理解这些现象,并提供了预防和解决这些问题的方法。最后,通过一个具体的死锁示例代码展示了如何在实践中遇到并发问题,并提供了几种常用的工具和技术来诊断和解决这些问题。本文旨在为并发编程的实践者提供一个全面的理解框架,帮助他们在开发过程中更好地处理并发问题。
|
6月前
|
安全
什么是死锁?互斥锁进入死锁怎么解决?
什么是死锁?互斥锁进入死锁怎么解决?
|
6月前
|
Linux
Linux线程同步(try锁和读写锁)
Linux线程同步(try锁和读写锁)
75 0
|
运维 Oracle 关系型数据库
Oracle优化02-锁和阻塞
Oracle优化02-锁和阻塞
126 0
并发锁(一):为什么要加锁
并发锁(一):为什么要加锁
160 0
并发锁(一):为什么要加锁
|
存储 安全 Java
看完你就明白的锁系列之锁的状态
前面两篇文章我介绍了一下 看完你就应该能明白的悲观锁和乐观锁 看完你就明白的锁系列之自旋锁 看完你就会知道,线程如果锁住了某个资源,致使其他线程无法访问的这种锁被称为悲观锁,相反,线程不锁住资源的锁被称为乐观锁,而自旋锁是基于 CAS 机制实现的,CAS又是乐观锁的一种实现,那么对于锁来说,多个线程同步访问某个资源的流程细节是否一样呢?换句话说,在多线程同步访问某个资源时,锁的状态会如何变化呢?本篇文章来探讨一下。
95 0
看完你就明白的锁系列之锁的状态
死锁终结者:顺序锁和轮询锁!(1)
死锁终结者:顺序锁和轮询锁!(1)
105 0
死锁终结者:顺序锁和轮询锁!(1)
死锁终结者:顺序锁和轮询锁!(3)
死锁终结者:顺序锁和轮询锁!(3)
102 0
死锁终结者:顺序锁和轮询锁!(3)
死锁终结者:顺序锁和轮询锁!(2)
死锁终结者:顺序锁和轮询锁!(2)
122 0
死锁终结者:顺序锁和轮询锁!(2)