对我很难,对你很易的高分题(sql+delphi)

hzzkf 2000-07-11 05:50:00
高手们:
小生在漫长的岁月中掌握了单机编写数据库的方法(包括sql语言),在近段的服务器/客户机结构的应用程序编写中也掌握了一定的知识。但是,目前我碰见了一个关于数据库记录锁定的问题很伤脑子,具体情况是这样的:某个用户在找到一条数据后按下'开始修改'键,此时,我想用某个方法或函数使这条数据的状态变为锁定(我查阅了一些资料,在讲到排他锁等概念时很笼统,不知如何进行锁定操作?)。而其他用户如果在查看到这条锁定记录时如果按下'开始修改'键,此时程序调用某个函数将检测这条记录的状态,如果锁定,则弹出一个提醒框,否则也能进行修改操作。在修改结束后按下'修改结束'调用某个方法或函数将这条记录修改成功并恢复能查能改的状态。以上是我的理想方法,但由于水平有限,只能将它束之在脑海中,请各高手赐教!!(小生目前的解决办法是在表中增加一个'锁定情况'的字段,在某个用户开始修改时记录的这个字段中人工加进一些字符,这样,在别的用户也修改时先看这条记录的'锁定情况'字段的内容,如果无内容便进行修改,当修改完毕后再清空记录的这个字段内容。虽然这是一个办法,但占用资源较大,况且如果用户在按下'开始修改'键而没有按下'修改完毕'键时巧遇断电,那么就需要在服务器中手工将记录的'锁定情况'字段的内容清空,非常麻烦。)
...全文
340 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pjy 2000-07-15
  • 打赏
  • 举报
回复
补充:SQL SERVER 7.0支持行级锁定,如果你用SQL SERVER 7.0,那你说的情况只有几个人同时修改一条记录时才会发生,估计概率不大吧?
pjy 2000-07-15
  • 打赏
  • 举报
回复
我觉得你不必要一定要求在修改中锁定此条记录,否则将会严重影响此程序的多用户性。你可设置QUERY的UpdatedModal为UpWhereAll,这样在保存是,数据库会自动判断此条记录是否被别人改变。你总不会希望在修改时,别人看都不能看此条记录吧?
junr 2000-07-14
  • 打赏
  • 举报
回复
对于ymxxm的回答,我想补充一点:
在用Midas时,通过在DataSetProvider中设allowCommandText为true(Options中)然后就可以在客户端把sql语句'update tablename set....'赋给ClientDataSet的CommandText属性,再execute即可实现数据的更新。用Insert时也是同样的方法。但要注意此操作不返回数据集,要注意光标位置。
town 2000-07-13
  • 打赏
  • 举报
回复
1.点击"开始修改"时不用锁定,在保存的那一时刻才处理锁定。(不必做成实时更新)。
2.数据接口应该支持记录的锁定,如ADO的LockType=ltOptimistic(开放式锁定)/ltBatchOptimistic(开放式批更新),由数据库自动处理同步更新数据。其它我不清楚(我常用ADO+Oracle/Access)。
ymxxm 2000-07-12
  • 打赏
  • 举报
回复
1。使用Midas技术。Database要shared(即使用同一个Session)否则和单机一样控制。并且不能使用SQL语句直接更新数据。
2。A。使用Select * from for update...锁定要修改的数据。
B。若上述Sql不成功,则表示有人锁定记录。
Select * from where rownum<Max
扩大搜索范围。
使用A+关键字(条件),一笔笔修改即可,(使用SQL语句更新)
码狂 2000-07-12
  • 打赏
  • 举报
回复
很报歉,对于大型数据库来说只支持表锁定和页面锁定。
表锁定我想不用说了,页面锁定是指锁定SQL server储存结构中的一个页面通常都会锁定几条记录。通常我们只在储存过程中使用页面锁定。
你为什么不直接用Query控件用“UPDATE ”来实现呢?
zsr 2000-07-11
  • 打赏
  • 举报
回复
试试TDatabase的StartTransaction吧!
sunjian 2000-07-11
  • 打赏
  • 举报
回复
加入锁定字段不是一个好方法。
具体方法可使用MIDAS中数据提交技术,应当把这种数据逻辑和完整性的处理放在AppServer中进行,放在Client端是一个很笨的方法,同样也不能保证你所谓锁的问题。

AppServer在更新数据时,如果发现数据跟新的异常,在把产生的异常回传给Client,提示用户进一步处理,可参考Delphi的Demo例子
bpc 2000-07-11
  • 打赏
  • 举报
回复
BDE在这种情况下会报错,不让修改。
你可以在程序中可以截获错误。提示
信息,并做别的工作。
hzzkf 2000-07-11
  • 打赏
  • 举报
回复
各位:
我的修改不是实时动态的,是将某条记录的数据读到几个edit(不是dbedit)中,然后在修改完后将几个edit中的数据再传回数据表中。记录在修改中是被锁定的,具体锁定的语法我也不详。也欢迎大家对我的修改模块提出自己在实际编程中的锁定建议。
halfdream 2000-07-11
  • 打赏
  • 举报
回复
没有必要这样做,这是数据库服务器应有的东西。
你这样做反而会引出不少新的问题。
数据库可以自动处理锁定的问题,
如果你实在想手工控制的话,也用相应的SQL语法,可以查MS SQL的T-SQL手册。
如果使用事务,应尽可能减小单个事务的时间。
在一些情况下,使用DELPHI的缓存更新替代事务, 可以加快处理过程。
有些数据库基础理论性的书可以看看。

zsr 2000-07-11
  • 打赏
  • 举报
回复
用数据服务器好象没有必要这么做吧??

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧