如何防止不同的客户端取数据时取到相同的记录

houzx 2004-09-21 05:25:36
环境:服务器oracle8.17,客户端用ADO访问,C/S模式

几十个客户端执行完全相同的Select操作,表中有一个字段Status,在其为0时取出,取出后status置3,原来数据表小时问题不明显,现在执行取数据至少要花费1秒钟以上,在两个以上的客户端同时取数据时就会出现取到同一条数据的情况,请问针对这种情况如何避免呢?

我原来试过这样:
1、在服务端建一存储过程,传入取数据的SQL语句,返回记录集。没有效果,还是能取到同一条记录。
2、在select语句后加入for update,取出修改status时执行commit,但这样select语句取不到数据,返回记录集为空.
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bzszp 2004-09-22
  • 打赏
  • 举报
回复
这个不清楚
只要时再一个会话里面应该就没有问题
你看看是否有什么auto commit之类的属性。
你的这种情况用for update是再合适不过了。
houzx 2004-09-22
  • 打赏
  • 举报
回复
我用PL/SQL Developer测试过,是这种情况,不过我在程序中用ADO访问时,一加上for update返回记录集为空了,是connection和recordset有什么特别的设置吗?
bzszp 2004-09-22
  • 打赏
  • 举报
回复
不会的。
测试:
打开两个sql*plus
no.1:
08:45:02 SQL> select * from ttree where rownum=1 for update;

ID PID PRICE
---------- ---------- ----------
B A 2

已用时间: 00: 00: 00.47
08:45:46 SQL> update ttree set price=20 where rownum=1;

已更新 1 行。

已用时间: 00: 00: 00.63
08:45:54 SQL> commit;

提交完成。

已用时间: 00: 00: 00.31
08:45:57 SQL>

no.2:
08:44:32 SQL> select * from ttree where rownum=1 for update;

ID PID PRICE
---------- ---------- ----------
B A 20

已用时间: 00: 00: 42.41
08:45:57 SQL>
注意时间,在no.1没有提交之前,no.2的语句一直在等待。
houzx 2004-09-21
  • 打赏
  • 举报
回复
谢谢各位的回复!!

我想要的结果是多个客户端同时按取数据按钮时能取得不同的数据,我在条件中设置
了rownum=1,只取第一条纪录,主要是select语句执行时间比较长,在没取到纪录时
别的客户端再取时两个人就取到了同一条纪录。
to bzszp(www.bzszp.533.net):我只用一个客户端测试时记录集就返回eof
to wl3721() :我在取出记录时坐了一些判断就把select中作为条件的status更新了,
提交后再取绝对不会取到这条纪录,另一个客户端应该是在更新前取到的,用另一个
表处理应该和这样没有本质的区别。

不知我把select到update的流程全部写到存储过程中不知能不能避免这种情况,原来
这中间有很多判断都是加在程序中的,明天试一下
jack_4826 2004-09-21
  • 打赏
  • 举报
回复
不知道你想干什么??
hot.wind 2004-09-21
  • 打赏
  • 举报
回复
可以考虑另外建立一个表B,假设你现在要处理的表为A,当一个客户从表A取出一条记录的时候,在B中增加一条记录,记录当前的用户和A表中的主键字段,如果这条记录能插入到B表中,说明没有其他人在使用,当前的调用者可以使用这个记录,如果不能插入,说明有其他人在使用这个记录了。调用者使用完成后从B表中删除这条记录。
bzszp 2004-09-21
  • 打赏
  • 举报
回复
2、在select语句后加入for update,取出修改status时执行commit,但这样select语句取不到数据,返回记录集为空.

如果两个客户端取得的结果集相同,其中一个选取,并作了修改,commit后,第二个当然检索不到数据了。
这个逻辑不对吗?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧