执行没有死锁的存储过程和没有紧绷的应用程序
Executing Stored procedure without Deadlock and Application without hanging tight
我正在执行一个存储过程,该过程必须在服务器时间凌晨 12 点 01 点定期更新作业调度程序,没有任何死锁或任何干扰。
该过程将评估大约 15000 条记录的完整行以进行计算,并且必须对其进行更新,并且需要 2 分钟才能完成执行。
所以我在下面添加了这段代码,以避免在执行此过程时出现死锁,直到它完成。
SET DEADLOCK_PRIORITY HIGH
exec [ProcedureName]
SET DEADLOCK_PRIORITY LOW
此代码是否会导致数据库操作或应用程序性能出现问题?
注意:我对多人进行了测试,以便在执行查询的同时访问应用程序网格。它对性能没有任何影响,我的要求也得到了解决。但仍然想了解更多关于数据库的依赖关系。请推荐
谢谢
如果您为一个 stored proc
选择查询提示,任何并行进程都有可能发生死锁。
您可能不会注意到没有性能下降,因为其他查询可能会暂停。 sp_who2
。在执行 proc
时跟踪任何阻塞的进程是个好主意
SELECT * FROM dbo.sysprocesses WHERE spid IN
(SELECT blocked FROM dbo.sysprocesses where blocked <> 0)
如果您没有看到任何阻塞的进程,请在执行时检查是否有任何死锁。
SELECT L.request_session_id AS SPID,
DB_NAME(L.resource_database_id) AS DatabaseName,
O.Name AS LockedObjectName,
P.object_id AS LockedObjectId,
L.resource_type AS LockedResource,
L.request_mode AS LockType,
ST.text AS SqlStatementText,
ES.login_name AS LoginName,
ES.host_name AS HostName,
TST.is_user_transaction as IsUserTransaction,
AT.name as TransactionName,
CN.auth_scheme as AuthenticationMethod
FROM sys.dm_tran_locks L
JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
JOIN sys.objects O ON O.object_id = P.object_id
JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE resource_database_id = db_id()
值得查看 perfmon 计数器和执行时任何缓慢的 运行 查询。
争论的问题是为什么我们要使用SET DEADLOCK_PRIORITY HIGH
,你是否查看了数据库上设置的事务隔离级别。
切换到 read committed snapshot isolation level
将真正减少使用这些查询提示的需要。请参考https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server.
此查询将告诉您数据库中隔离级别的状态。
select name
, s.snapshot_isolation_state
, snapshot_isolation_state_desc
, is_read_committed_snapshot_on
, recovery_model
, recovery_model_desc
, collation_name
from sys.databases s
我正在执行一个存储过程,该过程必须在服务器时间凌晨 12 点 01 点定期更新作业调度程序,没有任何死锁或任何干扰。
该过程将评估大约 15000 条记录的完整行以进行计算,并且必须对其进行更新,并且需要 2 分钟才能完成执行。
所以我在下面添加了这段代码,以避免在执行此过程时出现死锁,直到它完成。
SET DEADLOCK_PRIORITY HIGH
exec [ProcedureName]
SET DEADLOCK_PRIORITY LOW
此代码是否会导致数据库操作或应用程序性能出现问题?
注意:我对多人进行了测试,以便在执行查询的同时访问应用程序网格。它对性能没有任何影响,我的要求也得到了解决。但仍然想了解更多关于数据库的依赖关系。请推荐
谢谢
如果您为一个 stored proc
选择查询提示,任何并行进程都有可能发生死锁。
您可能不会注意到没有性能下降,因为其他查询可能会暂停。 sp_who2
。在执行 proc
SELECT * FROM dbo.sysprocesses WHERE spid IN
(SELECT blocked FROM dbo.sysprocesses where blocked <> 0)
如果您没有看到任何阻塞的进程,请在执行时检查是否有任何死锁。
SELECT L.request_session_id AS SPID,
DB_NAME(L.resource_database_id) AS DatabaseName,
O.Name AS LockedObjectName,
P.object_id AS LockedObjectId,
L.resource_type AS LockedResource,
L.request_mode AS LockType,
ST.text AS SqlStatementText,
ES.login_name AS LoginName,
ES.host_name AS HostName,
TST.is_user_transaction as IsUserTransaction,
AT.name as TransactionName,
CN.auth_scheme as AuthenticationMethod
FROM sys.dm_tran_locks L
JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
JOIN sys.objects O ON O.object_id = P.object_id
JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE resource_database_id = db_id()
值得查看 perfmon 计数器和执行时任何缓慢的 运行 查询。
争论的问题是为什么我们要使用SET DEADLOCK_PRIORITY HIGH
,你是否查看了数据库上设置的事务隔离级别。
切换到 read committed snapshot isolation level
将真正减少使用这些查询提示的需要。请参考https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server.
此查询将告诉您数据库中隔离级别的状态。
select name
, s.snapshot_isolation_state
, snapshot_isolation_state_desc
, is_read_committed_snapshot_on
, recovery_model
, recovery_model_desc
, collation_name
from sys.databases s