【问题标题】:Executing Stored procedure without Deadlock and Application without hanging tight执行存储过程没有死锁和应用程序没有挂紧
【发布时间】:2017-11-24 18:09:19
【问题描述】:

我正在执行一个存储过程,它必须在服务器时间上午 12 点定期更新作业调度程序,而不会出现任何死锁或任何干扰。

该过程将评估大约 15000 条记录的完整行以进行计算,并且必须对其进行更新,并且需要 2 分钟才能完成执行。

所以我在下面添加了这段代码,以避免在执行此过程直到完成之前出现死锁。

SET DEADLOCK_PRIORITY HIGH

exec [ProcedureName]

SET DEADLOCK_PRIORITY LOW

此代码是否会导致数据库操作或应用程序性能出现任何问题?

注意:我在执行查询的同时与多人进行了测试以访问应用程序网格。它对性能没有任何影响,我的要求也得到了解决。但仍然想了解更多关于 DB 的依赖关系。请推荐

谢谢

【问题讨论】:

    标签: sql sql-server stored-procedures amazon-rds


    【解决方案1】:

    如果您为 stored proc 选择查询提示,则任何并行进程都有可能发生死锁。

    您可能不会注意到没有性能损失,因为其他查询可能会暂停。 sp_who2.在执行过程时跟踪任何阻塞的进程是个好主意

        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()
    

    值得在执行时查看性能计数器和任何运行缓慢的查询。 争论的问题是我们为什么要使用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
    

    【讨论】:

    • >>>在执行时检查是否有死锁:....
    • 我在真实场景中也遇到过同样的问题,我已经设置了电子邮件警报并进行了监控。 Ofcos 我们都知道 SQL 可以自行修复死锁,我认为找到死锁、表命中等问题的受害者很重要。
    • 任何死锁都将在您按 F5 执行代码之前解决
    • 很明显,当并行进程作为死锁的牺牲品被挂起时如何处理。我们是否查看跟踪标志 1204 和 1222 ?很高兴得到您的意见
    • >>> 当并行进程作为死锁的受害者被挂起时如何处理
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多