回 帖 发 新 帖 刷新版面

主题:是否有办法知道谁锁定了表

请问在做式用户开发的时候,是否有办法知道谁锁定了表?

回复列表 (共20个回复)

11 楼

[quote][quote][quote][quote]cbl518 大佬,我想知道是“谁”锁定了表或者记录,而不是要知道表或者记录被锁定了

因为在多用户使用环境,经常出现表被锁定,但又不知道是谁锁定表没有退出[/quote]
应该是写前锁定,写后立刻解开,估计你的程序设计思路有问题[/quote]


有些表是不能锁定的,如货品基本数据表,大家都要使用,如果都使用锁定的话,那程序就没得搞了

我就是想知道有没有这个功能[/quote]

你不知道锁有多种吗?不知道可以用共享方式打开吗?不知道如果锁定失败可以重试吗?不知道改更数据前加锁,改后立刻解锁吗?知道读锁和写锁吗?[/quote]



那你知道同时有100个用户操作系统会是什么样子不?想锁定就锁定呀

还有些用户在出现错误的时候,一直不手工点击,一定要等系统设定的时间到了,自动退出系统。这样会造成其他用户无法操作系统。你碰到过吗?

我们的系统不大,客户数据一般也超过10G,10年左右的资料(如果超过,我们另外处理)。我们公司开发该系统的时间也不长,大概从80年代末开始的,是香港的上市公司。本系统当初大概开发人员有20人左右,你觉得你说的内容只有你知道吗?是不是这些开发员都笨蛋?好象还有几个国外回来的研究生。不过现在已经使用另外的系统代替了。我只是想讨论技术问题

12 楼

[quote][quote]知道谁锁定了表,毫无意义,难道打个电话叫他赶快退出吗?
[/quote]


你知道“死锁”不?[/quote]
发生“死锁”是你程序设计的不合理!

多用户的锁定表,在不同的环境中,采用不同的方法,就是避免“死锁”。

13 楼

应该说在VFP里,
已经不怎么可能发生死锁了,
大部份死锁,都只是发生在低级处理里,
基本上都是操作系统的事情了,
我想这应该只是在教材里才会有讲过的。

在VFP里,
先锁定,函数返回锁定成功后更新,
完成后马上解锁。

只有在这一段时间里,其他用户是无法修改数据的,
他也没有必要去修改,也不会去修改,因为他不能锁定,
所以不会存在死锁问题,只有他成功锁定了,才有权限去修改。
所以应该尽量压缩锁定的时间。以免别人无法锁定。
能不锁则不锁,
能锁记录不锁表。

一般情况下,到了现在这个年代,
如果不想考虑锁定问题,或者用户实在太多太频繁,
还是建议使用SQL语句去更新会比较方便。
SQL的解释是会自动去处理锁定问题。

而CCB2000说的,却是一个行之很有效的办法,
就是锁定的时候记录在表,
需要处理的时候,检查一下谁在锁定表,
打个电话给他,叫他退出一下解锁。(这不是开玩笑的。)
非要说断电的问题.......干脆说地震好了。
可以告诉你,我从不买保险,社保纯粹是无奈被逼的。

14 楼

LZ:看来你对所谓的多用户环境下并不太了解,建议先补一下基础。说实话,你的问题太那个了

15 楼

到了现在还在谈死锁的问题,证明开发模式是一个死锁模式,多用户开发系统,只能说是修改提交成功与否,根本不存在死锁问题,模式错了,就不可避免死锁,好在网内电话不用付钱,只有多多得罪电话机了!

16 楼

无论任何环境下,多用户程序,
对于共享数据,
只有在更新数据(提交)的瞬间,
锁住要更新数据为只读。
这就是基本设计思路。

17 楼

[quote]添加以下字段:
uselock L
usemachine C
useuser C
usetime T

LOCK()时设置
UNLOCK()前清除

大家都可以查询哪台电脑、哪个用户、什么时间锁定了该记录了。
[/quote]
大谬也,这个方案是所谓的循环论证!如果有两个客户端同时去设置,到底是谁能设置?一样的取决于谁能先锁定

18 楼

[quote]知道谁锁定了表,毫无意义,难道打个电话叫他赶快退出吗?
[/quote]
[em28]平时可以退出来解锁,极端情况下如果客户断电或死机造成的死锁重启估计也没有用啊

19 楼

如果此系统从80年代末开始开发,最近数据量大了才出现问题,那我大胆猜测一下:
1、从当时的技术来看,估计是才用VF之类的直接访问数据库,同时也的确使用了锁定等技术,本来好象没有没有问题,方法思路等也是正确的。
2、但是这种方式是把表放在文件服务器上,而在客户端用VF打开,10G的数据,100个用户,哪怕是在局域网中,可想而知能达到什么样的文件传输速度!

这样大的系统还采用VF的表本身就是系统设计的错误

20 楼

参考一下:

LOCK():

PRIVATE m.q_status_reprocess
m.q_status_reprocess=LTRIM(STR(SET("REPROCESS"),64))

SET REPROCESS TO 0

PRIVATE m.q_lock0
m.q_lock0=IIF(!m.p_sql=0,f_sql_rlockstatus(),IIF(isexclusive(),"Exclusive",IIF(isflocked(),"File Locked",IIF(isrlocked(),"Record Locked","Record Unlocked"))))

PRIVATE m.q_lock
m.q_lock=0

DO CASE
CASE isexclusive()
   m.q_lock=1
CASE isrlocked()
   m.q_lock=1
OTHER
   DO WHILE .T.
      IF RLOCK()
         m.q_lock=1
         EXIT
      ELSE
         ***** =perr("其他用户正在使用记录!")
         m.q_lock=0
         EXIT
      ENDI
   ENDDO
ENDC

IF !m.p_sql=0
   m.q_lock=IIF(f_sql_rlock(),1,0)
ENDI

SET REPROCESS TO &q_status_reprocess

IF TYPE("m.p_sys_s_stationexclusive")="N".AND.!m.p_sys_s_stationexclusive=0
   IF m.q_lock=0
      =perr(_tt("其他用户正在使用工作站")+":'"+UPPE(ALLTRIM(m.p_u_machine))+"'!")
      =f_restorefromused(@q_used_t_station,"t_station")
      SELE (m.q_sele)
      RETU .F.
   ENDI
ENDI

IF m.q_lock=0
ELSE
   REPL uselock WITH .T.,;
      usemachine WITH m.p_u_machine,;
      useuser WITH m.p_u_id,;
      usename WITH m.p_u_name,;
      usetime WITH datetime()
   =f_sql_flush()
   *UNLOCK RECORD (IIF(RECN()>0,RECN(),RECCOUNT()+1+1))
   *IF !m.p_sql=0
   *   =f_sql_unlock()
   *ENDI
ENDI

...

UNLOCK():

PRIVATE m.q_status_reprocess
m.q_status_reprocess=LTRIM(STR(SET("REPROCESS"),64))

SET REPROCESS TO 0

PRIVATE m.q_lock0
m.q_lock0=IIF(!m.p_sql=0,f_sql_rlockstatus(),IIF(isexclusive(),"Exclusive",IIF(isflocked(),"File Locked",IIF(isrlocked(),"Record Locked","Record Unlocked"))))

PRIVATE m.q_lock
m.q_lock=0

DO CASE
CASE isexclusive()
   m.q_lock=1
CASE isrlocked()
   m.q_lock=1
OTHER
   DO WHILE .T.
      IF RLOCK()
         m.q_lock=1
         EXIT
      ELSE
         ***** =perr("其他用户正在使用记录!")
         m.q_lock=0
         EXIT
      ENDI
   ENDDO
ENDC

IF !m.p_sql=0
   m.q_lock=IIF(f_sql_rlock(),1,0)
ENDI

SET REPROCESS TO &q_status_reprocess

IF m.q_lock=0
ELSE
   REPL uselock WITH .F.,;
      usemachine WITH "",;
      useuser WITH "",;
      usename WITH "",;
      usetime WITH {//::}
   =f_sql_flush()
   UNLOCK RECORD (IIF(RECN()>0,RECN(),RECCOUNT()+1+1))
   IF !m.p_sql=0
      =f_sql_unlock()
   ENDI
ENDI

...

我来回复

您尚未登录,请登录后再回复。点此登录或注册