gpt4 book ai didi

sql - 循环可以锁自己吗?

转载 作者:行者123 更新时间:2023-12-03 00:23:09 24 4
gpt4 key购买 nike

循环可以 self 锁定吗?

昨晚测试组开了一个奇怪的勾。该应用程序有一个网格,用户可以在其中检查要推迟的事件测试人员选择了两个事件(ID:1 和 5),两个事件均被推迟,但其中一个事件的状态未更新

我知道必须更新 [Incident] 表并在 [IncidentDetail] 表中插入一条新记录我询问了两者并且喜欢这个:

Id IncidentKindCode TransportEntryId CreateDate             IncidentStatus CloseDate
-- ---------------- ---------------- ---------------------- -------------- ---------
1 11301 52 2014-08-26 19:23:21.47 1 NULL
5 11301 56 2014-08-26 20:06:17.94 0 NULL

Id IncidentId InsertDate DetailKind Reason IncidentUser PostponeDate
-- ----------- ---------------------- ---------- --------- ------------ -----------------------
9 1 2014-08-26 20:28:37.37 1 TEST TEST 8 2014-08-27 00:00:00.000
10 5 2014-08-26 20:28:37.37 1 TEST TEST 8 2014-08-27 00:00:00.000

测试人员的提示是有效的,因为此时 [Incident].[IncidentStatus] 值必须为零。深入研究后,我捕获了应用程序发送到服务器的确切查询(感谢分析器)。

declare @p1 int
set @p1=2
exec sp_prepexec @p1 output,N'@IDINCIDENT varchar(max) ,@REASON varchar(max) ,@USERCODE varchar(max) ,@POSTPONEDATE varchar(max) ',N'
DECLARE @ARRAY VARCHAR(8000), @DELIMITADOR VARCHAR(100), @SELECTEDID VARCHAR(8000);

SELECT @ARRAY = @IDINCIDENT
SELECT @DELIMITADOR = '';''

IF LEN(@ARRAY) > 0 SET @ARRAY = @ARRAY + @DELIMITADOR

WHILE LEN(@ARRAY) > 0
BEGIN

SELECT @SELECTEDID = LTRIM(SUBSTRING(@ARRAY, 1,
CHARINDEX(@DELIMITADOR, @ARRAY) - 1))

BEGIN
UPDATE [dbo].Incident SET INCIDENTSTATUS = 1 WHERE ID = @SELECTEDID
INSERT [dbo].IncidentDetail (INCIDENTID, DETAILKIND, REASON, INCIDENTUSER, POSTPONEDATE)
VALUES (@SELECTEDID, 1, @REASON, @USERCODE, @POSTPONEDATE);
END

SELECT @ARRAY = SUBSTRING(@ARRAY,
CHARINDEX(@DELIMITADOR, @ARRAY) + 1, LEN(@ARRAY))
END
',@IDINCIDENT='1;5',@REASON='querty',@USERCODE='1',@POSTPONEDATE='2014-08-28 00:00:00'
select @p1

没有触发器,没有其他更新,没有待处理的事务。据我所知,即使第一个循环迭代阻塞了第二个循环以至于更新失败,也必须引发异常并回滚所有事务。

似乎不合逻辑的是,插入工作时更新可能会失败。所有列都有标准类型(Int、Varchar(100)、DateTime 等),我还测试了隐式转换问题。

这个问题只发生过一次,即使使用备份也无法重现,但如果我找不到发生的原因,恐怕它可能会在生产中再次发生。

最佳答案

我不明白你到底想做什么。我根据我的理解给你一个方法。您可以检查该条目是否已更新,如果已更新,则插入到 IncidentDetail 中。

UPDATE [dbo].Incident SET INCIDENTSTATUS = 1 WHERE ID = @SELECTEDID

If Exists( Select 1
From [dbo].Incident As I
Where I.ID = @SELECTEDID
And I.INCIDENTSTATUS = 1
)
Begin
INSERT [dbo].IncidentDetail (INCIDENTID, DETAILKIND, REASON, INCIDENTUSER, POSTPONEDATE)
VALUES (@SELECTEDID, 1, @REASON, @USERCODE, @POSTPONEDATE);
End

关于sql - 循环可以锁自己吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com