我的应用程序中有一条SQL语句。我想知道该声明获得了哪些锁;我怎么能用SQL服务器呢? 该声明涉及僵局,我正在试图分析;我无法重现死锁。 我在MS SQL Server 2005上运行。
答案 0 :(得分:4)
您可以在事务中运行该语句,但不能提交事务。由于锁将一直保持到提交事务为止,因此您可以有时间检查锁。 (不是无限期,但默认为5分钟。)
像:
BEGIN TRANSACTION
select * from table
然后打开Management Studio并检查锁定。他们在管理层 - >活动监控 - >按对象锁定或按进程锁定。完成后,运行:
COMMIT TRANSACTION
释放锁。
答案 1 :(得分:3)
我建议您在第一个实例中打开死锁检测跟踪标志,而不是无限期地运行Profiler跟踪。
这样,事件详细信息将记录到SQL Server错误日志中。
查看以下联机丛书参考,了解各种跟踪标志的详细信息。您需要使用1204和/或1222
http://msdn.microsoft.com/en-us/library/ms188396(SQL.90).aspx
确保使用服务器范围启用跟踪标志,而不仅仅是当前会话。例如使用:
DBCC TRACEON(1222,-1)
答案 2 :(得分:3)
这是一个查询,它将显示所有活动锁,谁拥有它们以及它们所处的对象。我几年前从一篇Technet文章中提取过这个文章。它适用于SQL 2000和2005(将sysobjects更改为2005年的sys.objects。)如果要将WHERE子句限制为仅此数据库,并且仅限于“EXCLUSIVE”锁定,则取消注释WHERE子句。
select 'Locks' as Locks,
spid, nt_username, name, hostname, loginame, waittime, open_tran,
convert(varchar ,getdate() - last_batch, 114) as TimeSinceLastCommand,
case req_mode
when 0 then 'Not granted'
when 1 then 'Schema stability'
when 2 then 'Schema modification'
when 3 then 'Intent shared'
when 4 then 'Shared intent update'
when 5 then 'Intent shared shared'
when 6 then 'Intent exclusive'
when 7 then 'Shared Intent Exclusive'
when 8 then 'Shared'
when 9 then 'Update'
when 10 then 'Intent insert NULL'
when 11 then 'Intent shared exclusive'
when 12 then 'Intent update'
when 13 then 'Intent shared-update'
when 14 then 'Exclusive'
when 15 then 'Bulk operation'
else str(req_mode) end as LockMode
from master..syslockinfo
left join sysobjects so on so.id = rsc_objid
left join master..sysprocesses sp on sp.spid = req_spid
--where rsc_dbid = (select db_id()) and ltrim(req_mode) in (6,7,11,14)
答案 3 :(得分:2)
在探查器中运行跟踪(选择空白模板),选择死锁图事件,并在出现的新选项卡(事件提取设置)上,将每个(在单独检查保存死锁XML事件)保存在自己的文件中。在xml查看器中打开此文件,可以很容易地判断发生了什么。每个进程都包含在内,包含一堆过程调用等,所有锁都在那里。
让这个跟踪运行直到再次发生死锁,仅在发生死锁时记录信息,因此开销不大。如果它再也不会发生,好的就会解决,如果不是你已经捕获了所有的信息。
答案 4 :(得分:0)
您可以在开发框中运行探查器跟踪以查看查询,并确切了解所执行的锁定。这通常是大量数据,但其中大部分都是您可以浏览的模式。例如。对于读取提交的隔离,您将看到在执行表或索引扫描时获取和释放的一系列锁(每行必须在读取之前锁定,并在读取后立即释放)。
你运行的是什么隔离?什么样的查询陷入僵局?您是使用包含多个更新的显式事务,还是单个语句死锁?
死锁的最典型情况是具有序列的事务(更新表x,更新表y),以及具有序列的第二个事务(更新表y,更新表x)。常见的解决方案是确保跨查询使用相同的更新序列。
让我们知道它们是什么类型的查询,不同类型的交易存在不同的常见问题。
答案 5 :(得分:-1)