如何防止不同的客户端取数据时取到相同的记录 2、在select语句后加入for update,取出修改status时执行commit,但这样select语句取不到数据,返回记录集为空. 如果两个客户端取得的结果集相同,其中一个选取,并作了修改,commit后,第二个当然检索不到数据了。这个逻辑不对吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以考虑另外建立一个表B,假设你现在要处理的表为A,当一个客户从表A取出一条记录的时候,在B中增加一条记录,记录当前的用户和A表中的主键字段,如果这条记录能插入到B表中,说明没有其他人在使用,当前的调用者可以使用这个记录,如果不能插入,说明有其他人在使用这个记录了。调用者使用完成后从B表中删除这条记录。 谢谢各位的回复!!我想要的结果是多个客户端同时按取数据按钮时能取得不同的数据,我在条件中设置了rownum=1,只取第一条纪录,主要是select语句执行时间比较长,在没取到纪录时别的客户端再取时两个人就取到了同一条纪录。to bzszp(www.bzszp.533.net):我只用一个客户端测试时记录集就返回eofto wl3721() :我在取出记录时坐了一些判断就把select中作为条件的status更新了,提交后再取绝对不会取到这条纪录,另一个客户端应该是在更新前取到的,用另一个表处理应该和这样没有本质的区别。不知我把select到update的流程全部写到存储过程中不知能不能避免这种情况,原来这中间有很多判断都是加在程序中的,明天试一下 不会的。测试:打开两个sql*plusno.1:08:45:02 SQL> select * from ttree where rownum=1 for update;ID PID PRICE---------- ---------- ----------B A 2已用时间: 00: 00: 00.4708:45:46 SQL> update ttree set price=20 where rownum=1;已更新 1 行。已用时间: 00: 00: 00.6308:45:54 SQL> commit;提交完成。已用时间: 00: 00: 00.3108: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.4108:45:57 SQL> 注意时间,在no.1没有提交之前,no.2的语句一直在等待。 我用PL/SQL Developer测试过,是这种情况,不过我在程序中用ADO访问时,一加上for update返回记录集为空了,是connection和recordset有什么特别的设置吗? 这个不清楚只要时再一个会话里面应该就没有问题你看看是否有什么auto commit之类的属性。你的这种情况用for update是再合适不过了。 plsql连接oracle11G出现ORA-12154: TNS: 无法解析指定的连接标识符 with xx as do 的用法 一张收集分析用户行为的表 oracle如何将不同条件的查询结果并列 再起一贴问JOB的问题!高手指点! 急!! 我的oracle9i for Linux是cpio.gz格式的, 请教如何安装? 请教高手!急!急!急! 在SQL Plus如何找看现在的实例名? 触发器能在存储过程中用动态sql创建吗? 数据库迁移 ●大家看这个存储过程在sql/plus 中怎么执行啊。 请大家推荐一本oracle开发方面比较经典的书籍
了rownum=1,只取第一条纪录,主要是select语句执行时间比较长,在没取到纪录时
别的客户端再取时两个人就取到了同一条纪录。
to bzszp(www.bzszp.533.net):我只用一个客户端测试时记录集就返回eof
to wl3721() :我在取出记录时坐了一些判断就把select中作为条件的status更新了,
提交后再取绝对不会取到这条纪录,另一个客户端应该是在更新前取到的,用另一个
表处理应该和这样没有本质的区别。不知我把select到update的流程全部写到存储过程中不知能不能避免这种情况,原来
这中间有很多判断都是加在程序中的,明天试一下
测试:
打开两个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的语句一直在等待。
只要时再一个会话里面应该就没有问题
你看看是否有什么auto commit之类的属性。
你的这种情况用for update是再合适不过了。