Chinaunix首页 | 论坛 | 博客
  • 博客访问: 361371
  • 博文数量: 71
  • 博客积分: 4691
  • 博客等级: 上校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-14 15:14
个人简介

who am i ... i'm back.

文章分类

全部博文(71)

文章存档

2014年(4)

2011年(1)

2010年(22)

2009年(17)

2008年(27)

我的朋友

分类: Sybase

2009-11-26 23:02:04

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 分析完!


阅读(1266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~