Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我认为BEGIN/COMMIT TRAN之间的所有事务都被视为一个成功或失败的事务?_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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

Sql server 我认为BEGIN/COMMIT TRAN之间的所有事务都被视为一个成功或失败的事务?,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,这是我的密码。这很简单:第一次插入失败,而最后两次插入成功 在继续之前,我想澄清一下,我知道我可以插入带有@ERROR的IF语句,或者开始回滚以解决问题。我知道如何解决这个问题 由于脚本中的两个插入都位于BEGIN/COMMIT TRAN之间,因此我认为这将被视为一个事务。所以在我的例子中,由于第一次插入失败,所以我假设下面的插入不会执行或提交。看来情况并非如此 BEGIN TRAN和COMMIT TRAN的目的是能够在它们之间使用@@ERROR函数和/或ROLLBACK TRAN吗 IF OB

这是我的密码。这很简单:第一次插入失败,而最后两次插入成功

在继续之前,我想澄清一下,我知道我可以插入带有@ERROR的IF语句,或者开始回滚以解决问题。我知道如何解决这个问题

由于脚本中的两个插入都位于BEGIN/COMMIT TRAN之间,因此我认为这将被视为一个事务。所以在我的例子中,由于第一次插入失败,所以我假设下面的插入不会执行或提交。看来情况并非如此

BEGIN TRAN和COMMIT 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
谢谢。

Table variables@testTable不支持事务

如果您需要事务性支持,请改用普通临时表testTable

Table variables@testTable不支持事务


如果您需要事务性支持,请改用普通临时表testTable

要使本系列插入一个全有或全无的情况,您需要使用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

要使本系列插入一个全有或全无的情况,您需要使用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

有相关文档吗?@roryap-因为表变量的作用域有限,并且不是持久数据库的一部分,所以它们不受事务回滚的影响。谢谢,@SeanLange!我正在搜索-您正在查找:-@rbhatup如果您想在出现错误时以不同的方式执行操作,则需要使用try/catch。请参阅此处的讨论:查看在什么情况下事务将自动回滚,这就是我认为您所说的单故障单元。是否有相关文档?@roryap-因为表变量的作用域有限,并且不是持久数据库的一部分,它们不受事务回滚的影响。谢谢,@SeanLange!我正在搜索-您正在查找:-@rbhatup如果您想在出现错误时以不同的方式执行操作,则需要使用try/catch。请参阅此处的讨论:查看在什么情况下事务将自动回滚,这就是我认为您所说的单失败单元。正如我在下面的评论和最初的帖子中提到的,我理解如何解决这个问题。我只是说,我认为BEGIN/END TRAN是一种将多个事务(即3个插入)转换为一个成功或失败的单元的方法。显然,BEGIN TRAN和COMMIT TRAN的目的是能够使用@@ERROR函数或try/catch检查错误,然后回滚事务。正如我在下面的评论和第一篇文章中提到的,我知道如何解决这个问题。我只是说,我认为BEGIN/END事务是一种处理多个事务的方法,即3个插入,并将它们转换为一个成功或失败的单元。显然,BEGIN TRAN和COMMIT TRAN的目的是能够使用@@ERROR函数或try/catch检查错误,然后回滚TRAN。