处理锁、阻塞和死锁(1)——确定长时间运行的事务
2015-01-07 21:03
399 查看
前言:
事务是OLTP系统中的主要部分。它管理数据一致性和数据并发问题,当多个资源同时被读取或者修改相同数据时,SQLServer会通过锁定机制来确保数据库中的数据总是处于一个有效状态。在SQLServer中,锁管理器是负责实现这些锁机制。SQLServer对于不同的资源类型提供不同的锁类型,如数据库、文件、对象、表、区、页和键。当你使用事务时,依然会遇到由事务引起的问题,这些通常是由于锁、阻塞和死锁引起的。
本系列将讲解这三部分的概念。
确定长时间运行的事务:
长时间运行的事务会阻塞其他事务,并且引发新一轮的长时间运行事务!这将严重影响数据库服务器的性能。作为DBA,你需要经常监控服务器的事务,当你发现有长运行的事务时,需要使用必须的步骤纠正。本文将讲解通过事务的持续时间去监控这些事务,如果经常找到一些事务持续时间很长,你可能需要查找是否被其他事务阻塞了,或者深入研究事务的语句是否有问题。
准备工作:
本文使用SQLServer2012的示例数据库AdventureWorks2012数据库。步骤:
1、 打开SQLServer,连接到AdventureWorks2012数据库。2、 输入以下脚本,使其开启一个简单的事务:
[sql]
view plaincopyprint?
USE AdventureWorks2012
GO
BEGIN TRANSACTION
SELECT *
FROM Sales.SalesOrderHeader
USE AdventureWorks2012 GO BEGIN TRANSACTION SELECT * FROM Sales.SalesOrderHeader
3、 不关闭窗口,在新窗口中输入以下代码,监控当前正在运行的事务:
[sql]
view plaincopyprint?
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
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、 现在来关闭事务,在第一个窗口中输入:
[sql]
view plaincopyprint?
ROLLBACK TRANSACTION
GO
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()来返回当前数据库,作为筛选特定数据库上的事务信息。
相关文章推荐
- 第十六章——处理锁、阻塞和死锁(1)——确定长时间运行的事务
- 第十六章——处理锁、阻塞和死锁(1)——确定长时间运行的事务
- 第十六章――处理锁、阻塞和死锁(1)――确定长时间运行的事务
- 第十六章——处理锁、阻塞和死锁(1)——确定长时间运行的事务
- 第十六章——处理锁、阻塞和死锁(1)——确定长时间运行的事务
- 处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(二 UPDATE操作)
- 处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE 操作需要申请的锁(三 DELETE 操作)
- 死锁、阻塞处理--转载学习
- 事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务
- 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
- 处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(一 SELECT操作)
- 查看长时间运行的事务
- 查看sql server 2000阻塞死锁并处理 转
- ADO事务处理方式运行正常
- 第十六章——处理锁、阻塞和死锁(2)——侦测阻塞和阻塞查询
- 第十六章——处理锁、阻塞和死锁(2)——侦测阻塞和阻塞查询
- 查询sql server中的长时间运行的事务内容
- 事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行
- 触发器引起"事务(进程 ID 88)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"的错误
- 事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务