开发者社区 问答 正文

SQL Server 2008事务数后执行显示数量不匹配的开始和提交语句。 之前的数= 0,当前数=

错误出现在我取消后回滚事务行OutputID = 1

我想回滚事务如果任何序列号不匹配一个特定的OrderID。

你能请帮我我的事务。 开始和提交语句看起来对我好。 验证所有开始提交语句通过proc

Alter proc dbo.UpdatePartnerSerialNumbersBatchDetails
@OrderID int,
@SerialNumberDetails xml=null,
@SerialNumbersCount int,
@UploadedBy varchar(50),
@UploadedDate datetime,
@OutputID int out
as
Begin

BEGIN TRY

declare @BatchQty int,@BatchCount int

begin Transaction SerialNumbers

IF @SerialNumbersCount<>(select top 1 OrderQty from OrderMaster where OrderID=@OrderID and IsDeleted=0)
Begin
set @OutputID=-2
End

Else

Begin

update dbo.PartnerSerialNumbers set
BatchNo = T.N.value('(BatchNo/text())[1]', 'varchar(50)'),DataUploadfromPartner=1,
ExpiryDate = T.N.value('(ExpiryDate/text())[1]', 'Datetime'),SerialNoStatus='O',UploadedBy=@UploadedBy, UploadedDate=@UploadedDate
from @SerialNumberDetails.nodes('Root/SerialNumberDetails') as T(N)
where OrderID = @OrderID and SerialNo=T.N.value('(SerialNumber/text())[1]', 'varchar(50)')

set @BatchCount=@@RowCount
if @BatchCount <> (select top 1 OrderQty from OrderMaster where OrderID=@OrderID and IsDeleted=0)
Begin
set @OutputID=-1
--Rollback Transaction SerialNumbers
End
else
Begin
set @OutputID=1
update OrderMaster set DataUploadfromPartner=1 where OrderID=@OrderID
insert into SerialnumbersLogDetails(OrderID,SerialNo,GTINCode,OrderSentDate,OrderorPartner,
BatchNo,ExpiryDate)
select OrderID,SerialNo,GTINCode,null,'Partner',BatchNo,ExpiryDate
from PartnerSerialNumbers where OrderID=@OrderID
End

End

Commit Transaction SerialNumbers
END TRY
BEGIN CATCH
set @OutputID=0
Rollback Transaction SerialNumbers
END CATCH

End

展开
收起
SONGYiiiD 2019-12-06 21:34:10 1676 分享 版权
阿里云 AI 助理回答

您的存储过程设计中已经包含了事务处理逻辑,以确保数据的一致性。当您提到的错误出现在尝试回滚事务时(OutputID = 1),这实际上与您的逻辑设定有关,因为您在@BatchCount与从OrderMaster查询到的OrderQty不匹配时设置了@OutputID=-1并注释掉了直接回滚事务的语句。如果您的意图是在这种情况下确实需要回滚事务,您应该取消对Rollback Transaction SerialNumbers的注释。

根据您的需求,如果任何序列号不匹配特定的OrderID,您希望回滚事务。当前逻辑中并没有直接检查序列号是否匹配的显式条件,而是通过比较更新的行数(@BatchCount)和订单数量(OrderQty)来间接判断。如果您有更具体的序列号匹配验证需求,可能需要在过程中加入相应的验证逻辑。

下面是修改后的部分代码,我取消了对回滚事务的注释,并假设您的其他逻辑如预期工作:

...
Else 
Begin 
    update dbo.PartnerSerialNumbers 
    set 
        BatchNo = T.N.value('(BatchNo/text())[1]', 'varchar(50)'),
        DataUploadfromPartner=1, 
        ExpiryDate = T.N.value('(ExpiryDate/text())[1]', 'Datetime'),
        SerialNoStatus='O',
        UploadedBy=@UploadedBy, 
        UploadedDate=@UploadedDate 
    from @SerialNumberDetails.nodes('Root/SerialNumberDetails') as T(N) 
    where OrderID = @OrderID and SerialNo=T.N.value('(SerialNumber/text())[1]', 'varchar(50)')
    
    set @BatchCount=@@RowCount 
    if @BatchCount <> (select top 1 OrderQty from OrderMaster where OrderID=@OrderID and IsDeleted=0) 
    Begin 
        set @OutputID=-1 
        -- 这里取消注释以在条件不满足时回滚事务
        Rollback Transaction SerialNumbers 
    End 
    else 
    Begin 
        ...
    End 
End 
...

请确保在实际应用中测试这些更改,以验证它们是否符合您的业务规则和期望的行为。此外,考虑在事务处理之前增加更详细的检查逻辑,以直接验证序列号与OrderID的匹配情况,这样可以更加精确地控制事务的回滚条件。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答