如下取数有更好的方法吗,谢谢!

[复制链接]
查看11 | 回复9 | 2014-7-11 07:56:59 | 显示全部楼层 |阅读模式
我想取一批数据,源表为A,目标表为B 。
需求为将A表标志字段为FLAG=0的记录全部取来,插入到B表中 (B表的记录的FLAG字段正常值为0和1,0为未处理,1为处理)

为了保证一致性,我当前是这么处理的。
1、将A表要取的数据的FLAG=0 更新UPDATE 为FLAG=-1,成功后不提交!
2、接着将A表的FLAG=-1的记录插入到B表中,成功后不提交 (故意修改为一种中间状态值-1)
3、前面插入B表的动作完毕后,就将A表的FLAG修改为1 ,成功后不提交
4 、最后一起提交

以上方法能够保证UPDATE和INSERT是一致的,但是感觉步骤偏多了一些,毕竟UPDATE 了两次A表,UPDATE为-1的这步是为了保证一致性而做的中间动作!!!
有更好的方法吗?
[ 本帖最后由 wabjtam123 于 2010-2-5 16:22 编辑 ]
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
你想干嘛??我在呢么看到B的flag=-1了啊??
你是想保证插入到B中的时候,A的flag=0的置为1,但是又不要把没有插入到B的新增记录更新对吧?
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
是啊,是这个意思兄弟,所以我要把我取的数据锁了,UPDATE后不提交,和INSERT 加上最后UPDATE控制在一个事务里
我要是不把当前看到的数据更新为-1,那再INSERT的时候,有源头表会有新的FLAG=0的记录进来啊,我没法保证一致啊
[ 本帖最后由 wabjtam123 于 2010-2-5 16:26 编辑 ]
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
关注
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
你可以试试另外这个方法,不一定比两次UPDATE更好:
建一个临时表(提交自动删除的那种), 里面专门存放A表主键或ROWID.
用INSERT ALL .... SELECT ..... 同时插入到B表和临时表,临时表记录了本次插入涉及到的A表记录;
用MERGE或UPDATE把临时表里面记录的A表行全部修改状态。
这里利用的是INSERT ALL,同一个SQL的数据是一致的。
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
原帖由 newkid 于 2010-2-5 22:40 发表
你可以试试另外这个方法,不一定比两次UPDATE更好:
建一个临时表(提交自动删除的那种), 里面专门存放A表主键或ROWID.
用INSERT ALL .... SELECT ..... 同时插入到B表和临时表,临时表记录了本次插入涉及到的A表记录;
用MERGE或UPDATE把临时表里面记录的A表行全部修改状态。
这里利用的是INSERT ALL,同一个SQL的数据是一致的。

两个 session 同时做这件事,会出问题吧?
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
原帖由 guostong 于 2010-2-5 22:51 发表

两个 session 同时做这件事,会出问题吧?

只能有一个SESSION 做这个事。但是不影响A表的插入,新插入的下一轮再做。
楼主刚刚问过存储过程互斥的问题,所以我假设他只有一个SESSION运行这个。
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
重新看了看楼主的需求,为什么不用 mview?
或者 trigger 也可以
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
这么利用锁有点。。。
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
多谢各位兄弟指点,NEWKID兄的方法挺有新意,居然还利用了INSERT ALL ,呵呵,可以实验一下!另外MVIEW应用在PLSQL代码中吗,这样还倒真没想过,是否更可行呢?
TRIGGER是否应该避免了,性能怕更糟啊
[ 本帖最后由 wabjtam123 于 2010-2-6 08:08 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行