PARADOX表锁定的问题,各位请进==>(100分)

  • 主题发起人 主题发起人 舟舶通
  • 开始时间 开始时间

舟舶通

Unregistered / Unconfirmed
GUEST, unregistred user!
假如有两个进程P1,P2共亨一个Paradox表T1,
请问:
一、当P1锁定表T1(使用EDIT或LockTable),在P2中怎么懂得T1被P1锁定?
二、在Delphi中提供类似于VFP的Set Process to 30 命令的功能吗?
即:当T1被用户锁定时,应用程序有30秒等待的时间?当锁定的程序在此
时间内释放表的锁定,则应用程序继续访问表,当在30秒内,T1没有得到释放
则应用程序再进行下面的提示?
 
//Try to open Table1 with Exclusive true

// First, close Table1
Table1->Active = false;
do //until successful or user says to stop
{
try
{
Table1->Exclusive = true; // See if it will open
Table1->Active = true;
break; //if no error, exit the loop
}
catch(EDatabaseError &E)
{
//Ask if it is OK to retry
if ( Application->MessageBox("Could not open Table exclusively - retry?", NULL, MB_OKCANCEL) != IDOK)

throw; // throw to abort if user selects cancel
}
} while (true);
 
当然,通过捕捉错误总可以判断是不是被锁定,
但是这不是好方法,太麻烦了!
不过也谢谢你!
再等几天,看各位高人还有什么高招。

我这样解决这个问题:
在T1加一列Status : Boolean
当P1要修改T1时,先判断Status为真,
假如为真,则锁定表,并且修改Status为假。
这个时候当P2要修改记录时,当他发现Status为假,则等待,
直到P1操作结束(P1结束时修改Status为.t)

 
你采用的方法并不可靠!

因为当P1锁定表,修改Status之前,
如果P2要修改纪录就会出错。
 
to:舟泊通
你有没想过当P1修改了status后出现异常了,那么status就一直都是false,会造成死锁
而且你也没半法打开这个锁了?除非你用其他手段把这个字段变为true
我建议,要锁定之前不管三七二十一先修改那个字段,如果没有被锁定那么自然写会成功,
接着就加锁,如果写不成功说明之前已经有人加锁了,自然就放弃加锁了
 
to:Michael100
>因为当P1锁定表,修改Status之前,
>如果P2要修改纪录就会出错。
不会出错!因为读字段的值是不会出错的!

to terry_lzs:
你说的情况确实有,不过对于这种文件型的数据库,
真的是没有办法。

要结束问题了!
 
后退
顶部