sybase 的多级事务很头疼的问题,
先把其涉及的事务命令列出来吧:
begin transaction [tranname]
save transaction savepointname :主要这个transaction 和 name是必须的
commit [ transaction [tranname|savepointname]]
rollback [ transaction [tranname|savepointname]]
--commit transaction 后面的 name 均可以是tranname 或 savepointname。
从语法上看commit 和 rollback 对与savepoint 和 tran 是一样的,那这两个的区别在于哪儿那?
初步探索结果:
第一部分:不涉及savepoint
1. rollback 不带参数 : 回滚到最外层事务, 即这时 @@trancount=0
2. commit 不带参数 : 提交当前最低级别事务,这时 @@trancount = @@trancount-1
3. commit 带上层次的tranname: 结果目前发现同不带参数一样,即这时 @@trancount = @@trancount-1, 直觉上感觉不太能接受,因为带了上级别的tranname 了应该总得有点儿用吧!!!
如果 这条理解是正确的话,那我们可以总结低级别的(nested)commit 是可怜的,因为最终结果完全取决于最外层的决定。--难道就真的没用了么?目前没看出来。
4. rollback 带tranname : 这里的tranname 必须是最高(外)层的tranname ,否则“Cannot rollback t2 - no transaction or savepoint of that name found”。
rollback 另一个奇怪的问题是 就算是 tranname 是当前级别的tranname 也会同样报错,让人无法接受。
到以上掌握的情况来看,多级tran 毫无用处,只会增加额外的考虑和错误。!!切忌
问题比如: 在一个常驻程序,数据库长连接, 某个程序在执行时执行了如begin commit的操作,
这时都是成功的, 可能会依此给外部系统或用户反馈成功的响应信息,而这时数据库结果还是未提交的。
好险那!呵呵,不知道有同志遇到此情况没有,反正我觉得很后怕!!
----以上是不是杞人忧天呢, 还待验证,待续 。。晚了,还有正事儿没做呢。
希望下次可以吧savepoint 分析完!
阅读(1335) | 评论(0) | 转发(0) |