+ -
当前位置:首页 → 问答吧 → SQLSERVER2000存储过程事务问题

SQLSERVER2000存储过程事务问题

时间:2011-12-19

来源:互联网

我写了个存储过程里面包含事务 但是当我insert失败的时候 事务没有回滚 并报出了主键重复的错误 语句终止 
请我如何解决~~

作者: KFCILIKEIT   发布时间: 2011-12-19

看看你的存储过程怎么写的?

作者: fredrickhu   发布时间: 2011-12-19

在事务开始前,加一句 set xact_abort on
SQL code

create procedure sp_name
as
begin
set xact_abort on
begin tran
 [事务代码]
commit tran
end

作者: ap0405140   发布时间: 2011-12-19

设置自动回滚当前事物。把主键删了看看。把错误打印出来 print @@error

作者: szstephenzhou   发布时间: 2011-12-19

不行啊 都试过了 我的主键不是自增长的是自己添加的 当主键重复就报错

作者: KFCILIKEIT   发布时间: 2011-12-19

"当主键重复就报错"是正常的.(不报错才不正常)

但是,有set xact_abort on的话,事务中遇错是自动回滚的.

也就是说其实没有插入,事务中的其他语句也一起被回滚了.

作者: ap0405140   发布时间: 2011-12-19

但是我有一个返回值来接收啊 当操作失败要有返回值啊 现在是报错后我的返回值得不到了~

作者: KFCILIKEIT   发布时间: 2011-12-19

SQL2000没有try.. catch..

可以在前端程序中用try.. catch..捕获异常,才知道是否执行成功.

加set xact_abort on的目的是保证事务可正常回滚,即全做或全不做.

作者: ap0405140   发布时间: 2011-12-19

加个try catch

作者: kingtiy   发布时间: 2011-12-19

是不是 用sqlserver 2005就能起到回滚作用 并返回操作是否成功?

作者: KFCILIKEIT   发布时间: 2011-12-19

SQL2000,有"set xact_abort on"也能自动回滚,但无法返回操作是否成功.

SQL2005及以上版本,有"set xact_abort on"也能自动回滚,用try.. catch..就能返回操作是否成功.

作者: ap0405140   发布时间: 2011-12-19

谢了问题以解决 把数据库挂在sqlserver2005就可以了

作者: KFCILIKEIT   发布时间: 2011-12-19