我有 2 个 sql server 语句。
Delete from hello where id=1
Insert into hello name,age
select name ,age from welcome
如果其中任何一个失败,则不应进行删除或插入。
我尝试过交易
Begin Tran
Delete from hello where id=1
Insert into hello (name,age)
select name ,age from welcome
Commit Tran
但是如果其中一个出错了,另一个就犯了。我是不是错过了什么。
2 delete statements
BEGIN TRY
BEGIN TRAN;
delete from hello where id=1
delete from hello where id=19 // here id=19 doesn't exist
COMMIT TRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;
此处 id=19 不存在,因此应该回滚,但它正在删除 id=1。它是提交而不是回滚。在这个场景中我应该做什么..
最佳答案
But if either one is gone wrong .Other one is committed.Am i missing something.
是的,您缺少错误处理。根据错误的不同,T-SQL 批处理可能会在错误发生后继续执行后续语句,包括提交。下面是一个结构化错误处理示例,可以避免这种情况。
BEGIN TRY
BEGIN TRAN;
DELETE FROM hello WHERE id=1;
INSERT INTO hello (name,age)
SELECT name ,age FROM welcome;
COMMIT TRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;
更新:
如果您有其他不是 SQL Server 错误的业务规则,您可以检测 T-SQL 代码中的条件并引发错误以调用 CATCH block 并回滚:
BEGIN TRY
BEGIN TRAN;
DELETE FROM hello WHERE id=1;
IF @@ROWCOUNT < 1
BEGIN
RAISERROR('Row not found', 16, 1);
END;
INSERT INTO hello (name,age)
SELECT name ,age FROM welcome;
COMMIT TRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;
关于sql-server - SQL服务器事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40609468/