我被分配为系统交易做一个停止按钮。单击“停止”按钮后,我必须能够中断存储过程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)”的原因。有人可以建议新的解决方法吗?我本人是前端开发人员,对此我几乎没有经验