在begin tran前加上set xact_abort on即可保证事务的一致性create PROCEDURE dbo.testtrans
AS
set xact_abort on begin tran --语句1
insert test1(M1)values('sds') --语句2
insert test1(M2)values('name') --语句3
print '----ok------' --语句4
commit tran --语句5
RETURN
AS
set xact_abort on begin tran --语句1
insert test1(M1)values('sds') --语句2
insert test1(M2)values('name') --语句3
print '----ok------' --语句4
commit tran --语句5
RETURN
解决方案 »
- 如何实现如下查询结果!分数不够再加
- SQL Server安装
- mysql5.0调用存储过程
- 单用户模式下启动SQLSERVER的困惑
- 數據庫分配可用空間如何收縮
- SQL 语句由COLUMN转成RECORD的问题
- exec master..xp_cmdshell 'net use '和服务器上的net use 结果不同?
- 请教一个SQL语句
- 怎么解决:DBMS 073 ORACLE 7.3 not supported in your current installation.
- SQL2005无法恢复
- 看似简单的选出非重复行
- 我不小心删除了sql server帐号BUILTIN\Administrators,现在登陆不上sql管理器?
加上当然是可以的了,那么不加set xact_abort on
begin tran --语句1
insert test1(M1)values('sds') --语句2
insert test1(M2)values('name') --语句3
print '----ok------' --语句4
commit tran
和
insert test1(M1)values('sds') --语句2
insert test1(M2)values('name') --语句3
print '----ok------' --语句4
有什么区别,执行实际的结果都一样?
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)COMMIT TRANSET XACT_ABORT 为 OFF -- 只回滚产生错误的 Transact-SQL 语句BEGIN TRANINSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)COMMIT TRAN
指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。语法
SET XACT_ABORT { ON | OFF }注释
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。
begin tran --语句1
insert test1(M1)values('sds') --语句2
insert test1(M2)values('name') --语句3
print '----ok------' --语句4
commit tran
和
insert test1(M1)values('sds') --语句2
insert test1(M2)values('name') --语句3
print '----ok------' --语句4
有什么区别,执行实际的结果都一样?
==============
下面的是隐 性事务
ALTER PROCEDURE dbo.testtrans
@xml nvarchar(4000)
as
declare @hDoc int
exec sp_xml_preparedocument @hDoc output ,@Xml
--省略中间使用XML的语句
begin tran
insert test1(message)values('sds')
if @@error<>0 goto Inerror
insert test1([name])values('name')
if @@error<>0 goto Inerror
commit tran
exec sp_xml_removedocument @hDoc
return
Inerror:
begin
rollback
exec sp_xml_removedocument @hDoc
return
end
go
@xml nvarchar(4000)
)AS
declare @hDoc int
exec sp_xml_preparedocument @hDoc output ,@Xml --1
--省略中间使用XML的语句
begin tran
insert test1(message)values('sds')
insert test1([name])values('name') --2
if @@error <> 0
begin
....
return
end
commit tran
exec sp_xml_removedocument @hDoc --3
我说了insert test1([name])values('name') 出错的时候,这个存储过程都停止执行了.
以下的判断语句if @@error <> 0 还有跳转语句,更本没有机会执行?!!!