关于嵌套事务的问题?

more_zou 2004-11-09 09:37:29
刚使用SQL Server不久,碰见一个难题,希望大家帮忙.
比如象下面的过程.
create procedure p1
as
begin tran
do somework
if..
begin
if ..
commit
else
rollback
end
else
commit
------------------------------------

create procedure p2
as
begin tran
exec p1
if ..
commit
else
rollback
-------------------------------------

执行P2的时候会出现
服务器: 消息 266,级别 16,状态 2
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 1,当前计数 = 0。
服务器: 消息 3903,级别 16,状态 1
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

这里P2只是个测试,P2对应的事务应该是在程序中做
虽然帮助里说该错误可以忽略,但是我不想在程序中的到该错误.请问我该如何避免出现该错误?
谢谢!
...全文
204 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
more_zou 2004-11-09
  • 打赏
  • 举报
回复
顶..
more_zou 2004-11-09
  • 打赏
  • 举报
回复
还有,直接在查询分析器里执行p1是没错的.
more_zou 2004-11-09
  • 打赏
  • 举报
回复
回2楼的,我把P1改成这样也不行
create procedure p1
as
begin tran
do somework
if..
begin
if ..
commit
else
if @@trancount <> 0
rollback
end
else
commit

在过程中得到这个@@trancount是2
honestface 2004-11-09
  • 打赏
  • 举报
回复
你过程"ROLLBACK(或commit) TRANSACTION" 与 "BEGIN TRANSACTION "数量不一至,用这种写法比较好控制:
create procedure p1
as
begin tran
do somework
if..
begin
if ..
go error
end
if ..
go error
end

commit

return
error:
--raiserror ...自定义错误息信
rollback transaction
end
go

fxcl2006 2004-11-09
  • 打赏
  • 举报
回复
通常如果存储过程p1执行rollback tran则会出现这种情况,解决办法是在p2的rollback前面判断@@transcount是否为0,如果=0则不用rollback tran

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧