简书链接:sqlserver一个完整的事务提交和异常处理回滚逻辑处理演示代码
文章字数:592,阅读全文大约需要2分钟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
BEGIN TRAN MyTransaction -- 开始事务

-- 创建保存点,命名该保存点为 SavePoint1
SAVE TRAN SavePoint1

-- 执行一些数据库操作
INSERT INTO Table1 (Column1, Column2) VALUES ('Value1', 'Value2')
UPDATE Table2 SET ColumnA = 'NewValue' WHERE ID = 123

-- 模拟一个可能出错的地方
DECLARE @ErrorOccurred BIT = 0
IF EXISTS(SELECT 1 FROM Table3 WHERE InvalidCondition = 1)
BEGIN
SET @ErrorOccurred = 1
PRINT 'An error condition was met. Rolling back to SavePoint1.'
ROLLBACK TRAN SavePoint1 -- 回滚到保存点SavePoint1,撤销上面的UPDATE操作但保留INSERT
END

-- 如果没有错误,继续其他操作
IF @ErrorOccurred = 0
BEGIN
-- 执行更多的数据库操作
DELETE FROM Table4 WHERE ColumnB = 'Obsolete'
END

-- 根据情况提交或回滚事务
IF @ErrorOccurred = 0
BEGIN
COMMIT TRAN MyTransaction -- 所有操作成功,提交事务
PRINT 'Transaction committed successfully.'
END
ELSE
BEGIN
ROLLBACK TRAN MyTransaction -- 发生错误,回滚整个事务
PRINT 'Transaction rolled back due to error.'
END

其中save并不是提交,而是保存 一个点,而回滚则可以回滚事务点也可以回滚 保存点?

另外我发现 关于这个执行末尾穿透,需要直接return,否则会直接穿透到ErrTransHandle

    print ('---');
     SELECT @code=0,@msg='已经提交完成' 
     commit  tran tran_roll
     return     
   END

 ErrTransHandle:          
    SELECT @code=-1,@msg=  @msg+' 回滚了'
 rollback tran tran_roll           
ErrHandle:         

image.png
所以总结,
搞不懂咋回事不知道是我删了代码还是咋的,我发现丢失了一个提交事务和一个返回
因此导致数据提交还是被回滚了,所以没报错,如果 开始了事务没回滚也没进行提交,那也是会报错的,偏偏就出在我对语法不熟悉,就遇到这个问题,经过打印日志终于解决此问题。

不能调试的远程开发中,结合了打印加 存储转 sql 存储转 打印版本sql,各种方法便捷定位
甚至在执行存储的时候我弄了一个模拟执行语句的和设置的sql变量代码,方便直接粘贴到sql 中执行。
感兴趣的在vscode和搜索azud studio中搜索strore proc to sql