在事务中使用提交足够吗?

时间:2011-06-25 10:16:28

标签: transactions sql-server-2000

Commit中使用transaction,或者我也应该使用rollback

tabel1
  name   nvarchar(10)
  family nvarchar(20)

table 2 
    name nvarchar(10)
    family nvarchar(20) not null

begin transaction
insert into table2 (name) values('john')
insert into table1 (name,family) values('Joe','Lando')
commit transaction

如您所见第一个语句有错误。我应该在某个地方使用回滚吗?

2 个答案:

答案 0 :(得分:2)

如果您使用SET XACT_ABORT ON (SQL Server 2000 link)

,则可以跳过ROLLBACK
SET XACT_ABORT ON
begin transaction
insert into table2 (name) values('john')
insert into table1 (name,family) values('Joe','Lando')
commit transaction

从链接:

  

当SET XACT_ABORT为ON时,如果Transact-SQL语句引发运行时错误,则终止并回滚整个事务。

现在,如果你不使用它,你需要回滚。或者关闭你的连接。

SET XACT_ABORT ON的一个有用的副作用是在客户端CommandTimeout事件之后释放锁并回滚事务。否则,直到从SQL Server中删除 hard 连接才会发生这种情况:由于池的原因,它可以保持打开状态。

你的圣经应该是"Error Handling in SQL 2000 – a Background" by Erland Sommarskog:读一读。在SO:Do I really need to use "SET XACT_ABORT ON"?

答案 1 :(得分:0)

首先,我怀疑存储过程是否会实际编译,因为它会识别table2没有'family'字段。

其次,建议您为自己的理智进行某种形式的检查,但无论如何,SQL服务器会在出错时自动回滚。