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