日期:2014-05-18  浏览次数:20406 次

sql 主次存储过程 事务处理问题
现在有 一个 主存储过程 主存储过程调用 两个次存储过程 
主存储过程有 事务 处理 两个次存储过程 没有事务处理  


主存储过程 往 A表插入数据  

主 调用 次存储过程① 往B表插入数据 成功返回 0 失败 返回 -1

主存储过程 接受返回值 0 正常执行 -1 执行回滚

主 调用 次存储过程② 一个 往C表插入数据 成功返回 0 失败 返回 -1

主存储过程 接受返回值 0 正常执行 -1 执行回滚
主存储过程 往 D表插入数据  


如果 次存储过程① 执行失败 主存储过程 会 回滚, 会把 次存储过程① 执行的 也回滚吗?


如果 次存储过程② 执行失败 主存储过程 会回滚, 会把 次存储过程① 和 次存储过程② 执行的 也回滚吗?

如果 主存储过程 往 D表插入数据 执行失败 次存储过程①和次存储过程② 都会回滚吗?

 

------解决方案--------------------
你在处理的过程中,把数据提交的语句commit;放在最后一步即可.
------解决方案--------------------
探讨
引用:
你在处理的过程中,把数据提交的语句commit;放在最后一步即可.

在主存储过程 中 最后一步 写 commit 吗?  写了的话  不管 次存储过程 写不写 回滚  
在 主存储过程中 写了 事务的话   回滚的时候 也会把 次存储过程的  插入 回滚  是这个意思吗??

------解决方案--------------------
两个建议:
1、如果不确定的话,可以在两个次存储过程上都是用事务
2、既然需求很明确,自己测试一下不就清楚了,与其等别人给你答案,还不如自己动手去测试

另:答案是会回滚
------解决方案--------------------
会回滚。不信就自己测试下OK
------解决方案--------------------
原则上讲,遇到rollback tran即会回滚[上一个begin tran]到[rollback tran]之间的所有数据变更.

至于楼主的问题,得看你的begin tran,commit tran,rollback tran如何放了,放置正确自然可以回滚.
------解决方案--------------------
放最外层,最后面