SQL存储过程,如何回滚啊?

来源:百度知道 编辑:UC知道 时间:2024/06/08 18:10:46
假设这样一个存储过程:create proc ProcInsertSales @itemtitle char(100),@itemdate datetime,@uname char(20),@saletype char(20),@saledesc char(1000
as
begin
declare @iden int
insert items(itemtitle,itemdate)values(@itemtitle,@itemdate)
select @iden=@@IDENTITY
insert sales(saleid,uname,saletype,saledesc) values(@iden,@uname,@saletype,@saledesc)
return 0
end
如果第一个INSERT成功了,第二个INSERT失败了,那可不可回滚啊?
就是说,第二个INSERT失败了,那么第一个INSERT插入的数据如何回滚啦???

当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。OFF 是默认设置。

编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。有关详细信息,请参阅 分布式查询和分布式事务。

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。

示例
下列代码示例导致在含有其他 Transact-SQL 语句的事务中发生外键冲突错误。在第一个语句集中产生错误,但其他语句均成功执行且事务成功提交。在第二个语句集中,将 SET XACT_ABORT 设置为 ON。这导致语句错误使批处理终止,并使事务回滚。

复制代码
USE AdventureWorks;
GO
IF OBJECT_ID(N't2', N'U') IS NOT NULL
DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
DROP TABLE t1;
GO
CREATE TABLE t1
(a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
(a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3