我认为BEGIN / COMMIT TRAN之间的所有内容都被视为成功或失败的1个事务?

时间:2016-02-12 16:39:35

标签: sql-server sql-server-2008 tsql

这是我的代码。这很简单:第一个INSERT失败而后两个失败。

在我继续之前,我想澄清一点,我明白我可以插入IF statement @@ERRORBEGIN ROLLBACK来解决问题。我知道如何解决问题。

由于脚本中的两个INSERT都在BEGIN/COMMIT TRAN之间,我认为这将被视为单个事务。所以在我的情况下,由于第一个INSERT失败,我假设以下INSERT将不会执行或不会被提交。似乎情况并非如此。

BEGIN TRANCOMMIT TRAN的目的是能够在它们之间使用@@ERROR函数和/或ROLLBACK TRAN吗?

IF OBJECT_ID('tempdb..#testTable') IS NOT NULL DROP TABLE #testTable
create table #testTable
(
    Id int not null,
    Name varchar(100)
)

BEGIN TRAN T1;
insert into #testTable select null, 'Joe';
-- select @@ERROR
if @@ERROR = 0
BEGIN
    insert into #testTable select 1, 'Bob';
    insert into #testTable select 2, 'Ralph';
END
COMMIT TRAN T1;
select * From #testTable

感谢。

2 个答案:

答案 0 :(得分:3)

表变量(@testTable)执行 NOT 支持事务。

如果您需要事务支持,请改用普通的临时表(#testTable)。

答案 1 :(得分:2)

要使这个系列插入一个"全部或全部"您需要使用TRY / CATCH的情况

IF OBJECT_ID('tempdb..#testTable') IS NOT NULL DROP TABLE #testTable
create table #testTable
(
    Id int not null,
    Name varchar(100)
)

begin try
    BEGIN TRAN T1;
        insert into #testTable select 1, 'Bob';
        insert into #testTable select null, 'Joe';
        insert into #testTable select 2, 'Ralph';
    COMMIT TRAN T1;
end try

begin catch
    select 'Error encountered. No rows added'
    rollback transaction
end catch

select * From #testTable