Interbase(200分)

  • 主题发起人 主题发起人 nickname
  • 开始时间 开始时间
N

nickname

Unregistered / Unconfirmed
GUEST, unregistred user!
When two client operate the same record in server using storedproc,transactions
always lost.why?is there a queue for multiple user operate the same record at
the same time?
if two client oprerate two different record,fine;
if same record,always lose transcation!
???
help
help
 
你在two client 操作一条记录,是都在update?我没试验过,lost transactions?
还是lost record?应该不是lost record.
IB help said :storeproc是可以在事务中的。
 
我就在同时UPDATE同一条记录,有时STOREPROC根本没有运行,但是奇怪的是
interbase或者DELPHI也不返回error
 
why they never reply an error message and it looks like every thing is ok
I want to know wether there is a queue for the conflict transaction,for multiple
clients operate the same record at the same time.Two clients use the same
storedproc to update the same record.Is there anybody using interbase for C/S
application that can give me some suggestion?
HELP!HELP!HELP!
 
interbase 与其他数据库不同之处在于:
interbase遇到错误是立即自动将当前事务回滚,
而其他数据库则不会, 还有机会选择commit还是rollback在错误前已经作的数据修改
 
哦?搞不懂pipi的话。IB是行锁定,而有些DB是页锁定,任何一种锁定都会造成数据库
冲突的。那发生冲突后其它数据库如果不丢弃事务那又是如何处理的?IB不是也提供了
选择commit或rollback的机会吗?即使是在StoreProc中?
 
设定异常看看什么问题
 
barton:
意思是
假如在procedure中,
1、insert 1
2、raise error
3、insert 2

在客户中execute这个proc,
如果是在interbase,在第2步,出错,自动回滚,insert 1也没有了,事务也结束了,
立即返回,insert 2不执行
如果是在oracle等数据库,在第2步,出错,不自动回滚,事务仍然是存在的,
insert 1 仍然还在事务内,立即返回,insert 2不执行,这一点都一样。
在出现error返回后,如果执行commit,insert 1还是有的
 
这也太危险了吧,我在前台修改时发生冲突,它就自动给我回退了吗???
可是它连个ERROR都不返回吗?至少我试验是这样的,storedproc都没有执行,但是也不
返回个错误信息,这是什么数据库啊。
 
那些关于transaction的屁话都是骗人的吗,什么access mode,
lock resolution,isolation level......都是干什么用的,这不是坑人吗?
 
客户端会接收到exception的啊。不会什么反应都没有的
 
1 ibtransaction1.StartTransaction;
2 ibstoredproc1.ExecProc;
3 sleep(60000);
4 ibtransaction.Commit;
在storedproc里面就是一行update,把数量加1。
transaction是read committed,wait

我同时运行两个测试的程序,后运行的程序的确在第二句等了很久,等
先运行的那个完成了之后,它就顺利运行,看上去一切正常,但是表里只加了
一次1,不是加了两次1。

为什么??????我应该怎么做??????
 
我想知道在ORACLE中如果有这种情况发生,它是怎么做的,它是如何处理
两个客户同时修改一个记录的。
 
storedproc的具体内容是什么?
 
问题在于你的update的where参数,例如:
update zf
set
zf=zf+1
where
bh=:bh //如果你是用‘唯一’且‘不变’的编号(bh)做更新条件的话是不会出错的。
and zf=:zf {如果加上这句,问题就不一样了,因为A客户执行该存储过程后,服务
       器上的ZF字段的值已变,可是B客户端ZF的值没有改变,B客户执行该存
储过程还是用老的ZF字段值做为更新的条件,这样当然找不到要更新的
记录也就无法更新了。
       当然,如果B客户也及时更新此记录,取得了ZF字段的最新值,执行该存
       储过程也可以得到正确的结果。  
至于无法返回error,据我所知还没有好的办法,只有改写存储过程,自
       已判断是否找到了该记录,如果没找到就触发EXCEPTION,这样客户端就
       能得到error了。}
以上错误是从单机->C/S模式转换过程中经常碰到的问题,此问题如果放到单机模式下
是不会有错误的,避免这种错误关键在于转变观念,在 C/S模式中死锁、更新数据都应该
小心对待。
最后,非常高兴的是有这么多同路人。我也是一个 C/S模式的初学者,在学习中难免会
遇到麻烦、绕远,欢迎大家和我联系、交流心得,让我们共同进步。
homejun@etang.com
 

Similar threads

A
回复
0
查看
948
Andreas Hausladen
A
A
回复
0
查看
829
Andreas Hausladen
A
A
回复
0
查看
855
Andreas Hausladen
A
A
回复
0
查看
1K
Andreas Hausladen
A
后退
顶部