我正在寻找关于针对数据库的交易的一些澄清。
我有一个从.NET应用程序调用的sproc。 sproc包含在带有begin transaction和commit / rollback的Try-Catch中。 try-catch内部最多有四个可能的其他sprocs被调用,它们对表进行更新/插入。我相信那些sprocs也包含在try-catch中,包含begin transaction和commit / rollback。
如果这四个sproc中的任何一个在插入/更新时遇到错误,我想要回滚所有内容,但是因为所有的sprocs都是在自己的try-catch中单独包装,并带有begin tran和commit / rollback tran基本上不会一个sproc完成它提交的调用但如果第二个失败则第一个不会回滚。 这是它的工作方式吗? 调用的主要内容看起来像这样:
BEGIN TRY
BEGIN TRANSACTION
EXEC dbo.test_call1 @AccountName
EXEC dbo.test_call2 @accountNbr,@person
EXEC dbo.test_call3 @person,@order
EXEC dbo.test_call4 @order,@quantity
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
test_call1看起来与此相似:
BEGIN TRY
BEGIN TRANSACTION
BEGIN
INSERT INTO dbo.Account
(AccountName,AccountNumber,Source)
VALUES
(@AccountName,123456,'online' )
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
END
答案 0 :(得分:2)
(假设这是SQL Server)
内部事务基本上被忽略,外部事务的操作是整个事务的结果。 From MSDN:
SQL Server数据库引擎会忽略提交内部事务。根据最外层事务结束时采取的操作,提交或回滚事务。如果提交了外部事务,则还会提交内部嵌套事务。如果外部事务被回滚,那么所有内部事务也会回滚,无论内部事务是否单独提交。