执行其表正在存储过程中运行的查询

时间:2019-12-04 07:40:28

标签: sql sql-server deadlock

我被分配为系统交易做一个停止按钮。单击“停止”按钮后,我必须能够中断存储过程A并回滚。因此,我在存储过程中做了一些检查。

这是我的存储过程的示例流程:

START PROCEDURE
   BEGIN TRANSACTION A

      BUSINESS LOGIC...

      -- STOP CHECKER
      IF((SELECT STATUS FROM TABLENAME WITH(NOLOCK) WHERE CODE = @Code) = 'STOPPED')
         GOTO STOP_FUNC

      BUSINESS LOGIC...

      -- STOP CHECKER
      IF((SELECT STATUS FROM TABLENAME WITH(NOLOCK) WHERE CODE = @Code) = 'STOPPED')
         GOTO STOP_FUNC

   COMMIT TRANSACTION A
   RETURN 1  

   STOP_FUNC : 
   BEGIN
     ROLLBACK TRANSACTION A
     RETURN -1000
   END

END PROCEDURE

这是我对“停止”按钮的查询:

UPDATE TABLENAME SET STATUS = 'STOPPED' WHERE CODE = '50'

我进行了几次试运行

试运行1
首先执行UPDATE时,存储过程将在第一个检查器处停止-预期的行为

试运行2
当首先执行存储过程并随后执行UPDATE时,UPDATE会根据活动监视器进入死锁状态。然后它将等待SP完成,然后再将状态更新为“已停止”。

我现在真的很困。我知道该事务可能正在锁定我的表,这就是为什么我按照同事的建议在其中放置“ WITH(NOLOCK)”的原因。有人可以建议新的解决方法吗?我本人是前端开发人员,对此我几乎没有经验

0 个答案:

没有答案