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
网友评论