在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
如您所见第一个语句有错误。我应该在某个地方使用回滚吗?
答案 0 :(得分:2)
如果您使用SET XACT_ABORT ON (SQL Server 2000 link)
,则可以跳过ROLLBACKSET 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服务器会在出错时自动回滚。