SET DEADLOCK_PRIORITY (Transact-SQL)

本文介绍了在SQL Server 2008至当前版本以及Windows Azure SQL Database中,如何通过设置死锁优先级来指定当前会话与其他会话发生死锁时的相对重要性,从而避免不必要的事务回滚。


SQL Server 2014
此主题尚未评级 评价此主题

指定当前会话与其他会话发生死锁时继续处理的相对重要性。

适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。

主题链接图标 Transact-SQL 语法约定

SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar }

<numeric-priority> ::= { -10 | -9 | -8 | … | 0 | … | 8 | 9 | 10 }

LOW

指定如果当前会话发生死锁,并且死锁链中涉及的其他会话的死锁优先级设置为 NORMAL 或 HIGH 或大于 -5 的整数值,则当前会话将成为死锁牺牲品。 如果其他会话的死锁优先级设置为小于 -5 的整数值,则当前会话将不会成为死锁牺牲品。 此参数还指定如果其他会话的死锁优先级设置为 LOW 或 -5,则当前会话将可能成为死锁牺牲品。

NORMAL

指定如果死锁链中涉及的其他会话的死锁优先级设置为 HIGH 或大于 0 的整数值,则当前会话将成为死锁牺牲品,但如果其他会话的死锁优先级设置为 LOW 或小于 0 的整数值,则当前会话将不会成为死锁牺牲品。 此参数还指定如果其他会话的死锁优先级设置为 NORMAL 或 0,则当前会话将可能成为死锁牺牲品。 NORMAL 为默认优先级。

HIGH

指定如果死锁链中涉及的其他会话的死锁优先级设置为大于 5 的整数值,则当前会话将成为死锁牺牲品,或者如果其他会话的死锁优先级设置为 HIGH 或 5,则当前会话可能成为死锁牺牲品。

<数值优先级>

用以提供 21 个死锁优先级别的整数值范围(-10 到 10)。 它指定如果死锁链中涉及的其他会话以更高的死锁优先级值运行,则当前会话将成为死锁牺牲品,但如果其他会话以低于当前会话的死锁优先级值运行,则当前会话不会成为死锁牺牲品。 它还指定如果其他会话以相同于当前会话的死锁优先级值运行,则当前会话可能成为死锁牺牲品。 LOW 对应于 -5、NORMAL 对应于 0 以及 HIGH 对应于 5。

@  deadlock_var

指定死锁优先级的字符变量。 此变量必须设置为“LOW”、“NORMAL”或“HIGH”中的一个值。 而且必须足够大以保存整个字符串。

@  deadlock_intvar

指定死锁优先级的整数变量。 此变量必须设置为 -10 到 10 范围中的一个整数值。

当两个会话同时等待访问由其他会话锁定的资源时,便会发生死锁。 当 SQL Server 实例检测到两个会话发生死锁时,将选择其中一个会话作为死锁牺牲品来解决死锁。 此牺牲品的当前事务将回滚,且死锁错误消息 1205 返回客户端。 这样可释放由该会话所控制的所有锁,从而允许其他会话继续进行。

将哪个会话选为死锁牺牲品取决于每个会话的死锁优先级:

  • 如果两个会话的死锁优先级相同,则 SQL Server 实例将回滚开销较低的会话选为死锁牺牲品。 例如,如果两个会话都将其死锁优先级设置为 HIGH,则此实例便将它估计回滚开销较低的会话选为牺牲品。

  • 如果会话的死锁优先级不同,则将死锁优先级最低的会话选为死锁牺牲品。

SET DEADLOCK_PRIORITY 是在执行或运行时设置,而不是在分析时设置。

要求用户为 public 角色的成员。

以下示例使用变量将死锁优先级设置为 LOW

DECLARE @deadlock_var NCHAR(3);
SET @deadlock_var = N'LOW';

SET DEADLOCK_PRIORITY @deadlock_var;
GO

以下示例将死锁优先级设置为 NORMAL

SET DEADLOCK_PRIORITY NORMAL;
GO

USE [DXQcontrol_L1HIMCP1_Operational_W] GO /****** Object: StoredProcedure [dbo].[prodExecmgmtIdent__processBR] Script Date: 7/29/2025 9:03:21 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /*----------------------------------------------------------------------- Project: Duerr EcoEmos - Module Ident Stored Procedure: dbo.prodExecmgmtIdent__processBR Author: JM Initial date: 11. Nov 2020 Revisions: rev 1 - 11. Nov 2020, JM: wrapper function for the old OrderManagement to call dbo.prodExecmgmtIdent__processDR Input: @arg_dateEvt PLC timestamp of the reading event @arg_szRWStationTag Tagname for the reader (configured in table DS_CfgRegistrationPoint_TAB and for FB369 in addition in file IdentServer.ini) @arg_szDatasetIn Tracking data from PLC Output: @arg_szDatasetOut The mds data string which was merged by the new data from PLC and the last stored data string from DS_MDS_TAB Return: See the return codes of the several variables with name @iRetCode... ------------------------------------------------------------------------*/ CREATE PROCEDURE [dbo].[prodExecmgmtIdent__processBR] @arg_dateEvt DATETIME ,@arg_szRWStationTag NStringMin ,@arg_szDatasetIn VARCHAR(MAX) ,@arg_szDatasetOut VARCHAR(MAX) OUTPUT AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; SET DEADLOCK_PRIORITY HIGH; DECLARE @object_name VARCHAR(128) = OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID); ---------------------------------------------------------------------------------------------------- -- PRREQ-1908: avoid start of process with an open or uncommitted transaction DECLARE @log VARCHAR(MAX) = ''; DECLARE @tempTable TABLE(logExt VARCHAR(MAX)); IF XACT_STATE() <> 0 BEGIN SET @log = 'Start ' + @object_name + '; '; SET @log += '@@TRANCOUNT = ' + CAST(@@TRANCOUNT AS VARCHAR(MAX)) + '; '; SET @log += 'XACT_STATE() = ' + CAST(XACT_STATE() AS VARCHAR(MAX)) + '; '; SET @log += '@@spid = ' + CAST(@@spid AS VARCHAR(MAX)) + '; '; SET @log += 'ProcParam: '; SET @log += 'rwStation: ' + @arg_szRWStationTag + '; '; SET @log += 'bodyId: ' + dbo.DS_FCT_GetPLCValueOf_(@arg_szDatasetIn, 'bodyId') + '; '; SET @log += 'skidId: ' + dbo.DS_FCT_GetPLCValueOf_(@arg_szDatasetIn, 'skidId') + '; '; SET @log += 'skidType: ' + dbo.DS_FCT_GetPLCValueOf_(@arg_szDatasetIn, 'skidType') + '; '; INSERT INTO @tempTable (logExt) SELECT DISTINCT 'spid=' + CAST(S.spid AS VARCHAR(MAX)) + '; hostname=' + RTRIM(S.hostname) + '; program_name=' + RTRIM(S.program_name) + '; hostprocess=' + RTRIM(S.hostprocess) + '; text=' + D.text + '; lastwaittype=' + RTRIM(S.lastwaittype) FROM sys.sysprocesses S CROSS APPLY sys.dm_exec_sql_text(S.sql_handle) D WHERE S.open_tran > 0; --ORDER BY S.hostname, S.program_name; ROLLBACK TRANSACTION; INSERT INTO dbo.DS_MDSErrorLog_TAB (dateEvt, rwStationId, source, errorCode, errorText) SELECT GETDATE(), @arg_szRWStationTag, @object_name, 'WARNING', isnull(logExt,'-') FROM @tempTable; EXEC dbo.DS_SP_MDSWriteToErrorLog @arg_rwStationId = @arg_szRWStationTag, @arg_szSource = @object_name, @arg_szErrorCode = 'WARNING', @arg_szErrorText = @log; END; ---------------------------------------------------------------------------------------------------- DECLARE @iRetValue INT; ------------------------------------------------------------------------------- -- write this information into log EXEC [dbo].[DS_SP_MDSWriteToLogger] @arg_szRWStationTag, @object_name, @arg_szDatasetIn; ------------------------------------------------------------------------------- -- set the prober function code SET @arg_szDatasetIn = STUFF( @arg_szDatasetIn, 1, 2, 'DR'); EXEC @iRetValue = [dbo].[prodExecmgmtIdent__processDR] @arg_dateEvt, -- DATETIME @arg_szRWStationTag, -- NStringMin @arg_szDatasetIn, -- VARCHAR(MAX) @arg_szDatasetOut OUTPUT; -- VARCHAR(MAX) RETURN @iRetValue; END; GO 逐条解析sqlserver的Sql语句语法用法
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值