小春网

 找回密码
 注册账号
查看: 1469|回复: 17
收起左侧

[IT 交流] 一个关于oracle数据更新的问题

[复制链接]
发表于 2009-1-19 13:36:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

x
现在的项目过程中,遇到一点小问题,ORACLE相关联问题想问一个:

oracle的数据库检索的时候,在一个事务当中,对同一条数据能够有2次更新么?
第2次被更新的数据是上一次更新完的数据还是第一次更新前的原始数据?

具体讲就是: 数据A,在一个事务当中,第一次被更新成B,在没有及时执行事务的情况下,
想把B再更新成C,之后再一次性完成事务。需要知道的是A和B的抽出条件是不是一样的?

以上,有oracle的高人给解释一下么,谢谢了
发表于 2009-1-19 13:51:49 | 显示全部楼层
不一样,第一次事务没有提交之前,在查询还是A的结果
回复

使用道具 举报

 楼主| 发表于 2009-1-19 14:10:15 | 显示全部楼层
原帖由 伤城 于 2009-1-19 13:51 发表
不一样,第一次事务没有提交之前,在查询还是A的结果


谢谢!

想问的就是数据B怎么才能抽取出来呢?
还是说没法支持这样的同一事务当中的顺次更新?
回复

使用道具 举报

发表于 2009-1-19 14:54:37 | 显示全部楼层
commit之后再查是可以找到B的结果,其他的方法没研究过
回复

使用道具 举报

 楼主| 发表于 2009-1-19 15:11:39 | 显示全部楼层
谢谢伤城

继续征求高手们多样化的见解,
当然要是有oracle的官方见解更好:)

其实事务的功能这一块,基本上是能够明白的。
就是突然遇到一个事务当中2次更新的例子,
所以想起来看看它支不支持这样的操作。


说得更开了去,看看oracle的事务处理是怎么一个流程。
好比说,一个事务启动之后,经过若干数据的检索更新处理,
在事务commit的时候,他是怎么一个逻辑,
是按顺序执行呢还是有什么优先顺位,或者是一次性全部覆盖更新。

有点怀疑是下面某一种情况:
1。第1次数据抽出的时候,数据被锁起来以供更新用。2次更新之前数据抽出出错。
2。数据全部更新之后,在事务执行的时候,更新冲突报错。
3。数据最终正常更新,但是可能只更新了一次(第一次的更新履历被忽略)

以上是个人的猜测,更清楚明白的朋友们,敬请帮忙解释一下会怎么样,为什么会这样
回复

使用道具 举报

发表于 2009-1-19 16:13:43 | 显示全部楼层
不好意思,刚才没有仔细看清楚,还以为是两个事务呢。
重新回答一下。
一个事务当中2次更新是可以的。
〉1。第1次数据抽出的时候,数据被锁起来以供更新用。2次更新之前数据抽出出错。
不同事务的情况下,是这样的。

一个事务当中可以多次更新,在要update的时候,一般是把这条data lock起来,其他事务不可进行更新,直到前一个事物提交或者撤销之后。
回复

使用道具 举报

 楼主| 发表于 2009-1-19 16:38:29 | 显示全部楼层
原帖由 伤城 于 2009-1-19 16:13 发表
不好意思,刚才没有仔细看清楚,还以为是两个事务呢。
重新回答一下。
一个事务当中2次更新是可以的。
〉1。第1次数据抽出的时候,数据被锁起来以供更新用。2次更新之前数据抽出出错。
不同事务的情况下,是这样 ...


谢谢!   其实是我的问题问得很含糊,加上后来又换了,不好意思哈。
非常感谢伤城你的回复。

我得做一次解释:
最初的问题是这样的
〉〉 一个事务里面,对一条数据抽出作2次更新是可以的,
  但是第2次更新时再抽出第一次更新完毕的数据可能么?

现在又追加几个问题
  〉〉 同一事务当中2次更新时候,更新对象数据应该是1次更新完的数据。
我们一般这样理解,不知道对不对。这个时候,数据库事务的更新纪录里面是几条呢?

〉〉 再者, 要是在第一次更新时没有加锁的话,第2次更新会不会报错呢?

这个问题现在很复杂化了,应经衍生成多个问题了,不好意思哈
回复

使用道具 举报

发表于 2009-1-19 17:03:38 | 显示全部楼层
>但是第2次更新时再抽出第一次更新完毕的数据可能么?
可以,抽出来的就是更新完毕的结果,我说的是同一个事务里哈。

〉同一事务当中2次更新时候,更新对象数据应该是1次更新完的数据。
〉我们一般这样理解,不知道对不对。这个时候,数据库事务的更新纪录里面是几条呢?
这样理解是对的,有两条,在commit之后,按顺序进行更新。

〉〉 再者, 要是在第一次更新时没有加锁的话,第2次更新会不会报错呢?
更新的时候可以自己加锁,不加的话一般会有默认锁,比如更新一条的话,只锁着一条
回复

使用道具 举报

发表于 2009-1-19 17:09:37 | 显示全部楼层
oracle里面,有专用的排他用法

for update wait 和nowait

你去查查,不知道你说的是不是这个东西
回复

使用道具 举报

 楼主| 发表于 2009-1-20 11:29:17 | 显示全部楼层
详细的解答,谢谢!

还是存在不太明白的地方,真是不好意思哈:P

>>但是第2次更新时再抽出第一次更新完毕的数据可能么?
>可以,抽出来的就是更新完毕的结果,我说的是同一个事务里哈。
第2次更新时的抽出条件是什么呢? 跟第一次用的检索条件一样么?

〉更新的时候可以自己加锁,不加的话一般会有默认锁,比如更新一条的话,只锁着一条
加锁之后,什么时候会释放呢? 2次更新之前还是在commit的时候?
如果是在commit的时候的话,一个事务里的2次更新时,1次更新的数据锁掉了,2次能更新么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表