同表先更新后插入是否需事务?SQL脚本执行顺序是否可靠?
关于SQL事务与执行顺序的问题解答
1. 是否需要使用事务?
必须用事务。你的逻辑是先更新现有记录的OrderNo,再插入新记录,这两个操作强关联:如果UPDATE执行成功但INSERT失败,那些被加1的OrderNo无法回滚,会造成数据顺序混乱。只有用事务包裹这两个操作,才能保证它们要么全部成功,要么全部失败,避免数据不一致。
给你的脚本加上事务处理(结合TRY/CATCH确保异常时回滚):
IF NOT EXISTS (SELECT TOP 1 * FROM dbo.Settings WHERE Descr = 'GL for Credit Memos') BEGIN SET IDENTITY_INSERT dbo.Settings ON DECLARE @newOrderNo INT; SET @newOrderNo = 7 -- OrderNo for credit memo to display below 'GL for A/P' BEGIN TRANSACTION BEGIN TRY -- Update order no. for settings below 'GL for Credit Memo' UPDATE dbo.Settings SET [OrderNo] = [OrderNo] + 1 WHERE [OrderNo] >= @newOrderNo INSERT INTO [dbo].[Settings] ([SettingID], [Created], [Descr], [Category], [OrderNo], [DataType], [InActive], [IsRequired]) VALUES (198, -- New Enum value for setting ID for 'Gl for Credit Memo' DEFAULT, 'GL for Credit Memo', 'Accounting', @newOrderNo, 4, NULL, 1) COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION -- 可选:抛出错误信息方便排查 THROW; END CATCH SET IDENTITY_INSERT dbo.Settings OFF END
2. SQL脚本的执行顺序是否严格遵循书写顺序?
是的,同一脚本文件里的SQL语句严格按照从上到下的顺序执行,除非有IF、WHILE这类控制流语句改变执行路径。
比如你如果把INSERT写在UPDATE前面,会先执行INSERT操作,再执行UPDATE。这在你的场景里会出问题:刚插入的OrderNo=7的记录,会被UPDATE语句(WHERE [OrderNo] >= @newOrderNo)命中,导致它的OrderNo变成8,和预期不符。所以必须保持现有脚本里UPDATE在前、INSERT在后的顺序。
内容的提问来源于stack exchange,提问作者user7496931
相关产品推荐
相关产品推荐

