--显式事务---
use
test
go
begin tran
select * from tb10 --假设这句没有任何问题
insert tb10 values('news.aspx?newsID=1992',156456,'好人啊....','hwj,'20080808','fdsfdsfsd',12) --假设这句违反PK约束(但是在实际情况中不知道那句或几句会出错)
update tb10 set realID = 8888 where realID = 1997 --假设这句没有任何问题,数据库有相应记录
if @@error <> 0 --这个@@error只检测最后一句发生问题的代码???
begin
rollback tran
print '事务已回滚'
end
else
begin
commit tran
print '事务已提交'
end我是原意是想select,insert,update中任一句出错都会回滚事务,但是如果错误发生不是在最后一句的话,错误后面正确的SQL语句就会执行,不会要在每一个SQL语句后面去if吧?还是根本另有方法?请指教,谢谢了!附结果
(所影响的行数为 20 行)服务器: 消息 2627,级别 14,状态 1,行 1
违反了 PRIMARY KEY 约束 'PK_tb10'。不能在对象 'tb10' 中插入重复键。
语句已终止。(所影响的行数为 1 行)事务已提交
use
test
go
begin tran
select * from tb10 --假设这句没有任何问题
insert tb10 values('news.aspx?newsID=1992',156456,'好人啊....','hwj,'20080808','fdsfdsfsd',12) --假设这句违反PK约束(但是在实际情况中不知道那句或几句会出错)
update tb10 set realID = 8888 where realID = 1997 --假设这句没有任何问题,数据库有相应记录
if @@error <> 0 --这个@@error只检测最后一句发生问题的代码???
begin
rollback tran
print '事务已回滚'
end
else
begin
commit tran
print '事务已提交'
end我是原意是想select,insert,update中任一句出错都会回滚事务,但是如果错误发生不是在最后一句的话,错误后面正确的SQL语句就会执行,不会要在每一个SQL语句后面去if吧?还是根本另有方法?请指教,谢谢了!附结果
(所影响的行数为 20 行)服务器: 消息 2627,级别 14,状态 1,行 1
违反了 PRIMARY KEY 约束 'PK_tb10'。不能在对象 'tb10' 中插入重复键。
语句已终止。(所影响的行数为 1 行)事务已提交
begin tran
declare @intErrorCode int
select @intErrorCode = -1;
update tb1 set column2 = 'X' where column1 = 1; -- 假设这句发生错误,则@@error != 0
@intErrorCode = @@errorif(@intErrorCode = 0)
begin
insert into tb2 values('插入成功',getdate());
@intErrorCode = @@error
endif(@intErrorCode = 0)
begin
commit tran -- 如果没有任何错误,则提交
end
else
begin
rollback tran -- 回滚事务
end
begin tran
declare @intErrorCode int
select @intErrorCode = -1;
update tb1 set column2 = 'X' where column1 = 1; -- 假设这句发生错误,则@@error != 0
select @intErrorCode = @@errorif(@intErrorCode = 0)
begin
insert into tb2 values('插入成功',getdate());
select @intErrorCode = @@error
endif(@intErrorCode = 0)
begin
commit tran -- 如果没有任何错误,则提交
end
else
begin
rollback tran -- 回滚事务
end
没有TRY语句。