精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖多层应用〗>>用stp技術訪問sql, 如何解決鎖與解鎖問題1

主题:用stp技術訪問sql, 如何解決鎖與解鎖問題1
发信人: sobetter()
整理人: foxzz(2003-06-17 18:30:14), 站内信件
【 在 sobetter 的大作中提到:】
:【 在 lzrwj 的大作中提到:】
::【 在 lzrwj 的大作中提到:】
:::【 在 sobetter 的大作中提到:】
::::【 在 lzrwj 的大作中提到:】
:::::當用戶 a 下載了某一記錄進行編輯, 當用戶 b 試圖下載同一條記錄時, 出提示, 告訴他這條記錄有人正在編輯. 如何做到?
:
:......
 最新战报:
我尝试尽量不接触sql的系统表,而用其t-sql命令来试验,不过还是没有很好的解决问题!
不过我发现锁定整个表不让其它用户读取则很容易,采用sql的排它锁可以完美的解决这个问题,示例如下:
你可以在两台机(a、b)测试:
首先a机先设定一些基本环境(假设con是已成功联接的句柄)
sqlsetprop(con,[DISPLOGIN],3)&&设置不出现登录框
sqlsetprop(con,[TRANSACTIONS],2)&&设置手动处理事务
&&开始抽记录啦
SQLEXEC(con,"select * from table1 with (tablockx,holdlock) where 条件","temp0")   &&关键就是那个tablockx ,发现没?多了个x ,这就是排它锁,没有它就是共享锁,嘿嘿
好了,再回到b机,执行:
sqlexec(con,"select * from table1 where ...")
哈哈,动不了了。(当然正常情况下,你应该设置等待时间,就不会无休止的等了。
设置等待时间命令:sqlsetprop(con,[querytimeout],n)&&n为秒数
这样b机或所有其它客户机要等到a机事务交付或回滚才能访问table1表了
在a机键入:
sqlrollback(con)   &&事务失败则回滚
或 sqlcommit(con)  && 事务成功则提交
再看回b机,喔,又可以访问罗。

当然以上方法真的要运用时要设定锁定超时时间以防止死锁:
sqlexec(con,[SET LOCK_TIMEOUT 5000])   &&5秒

这种方法只适合极小的c/s系统,对并发操作要求极底的情况才能用,但是大的c/s系统如果要达到你的要求又会有很多弊端,比如不能实时汇总等等。总之会牺牲一些并发操作作为代价d

好了,接着找找看有没有类似rowlockx 的命令,待续.....


----
 向大虾们学习、致敬!

[关闭][返回]