请教各位大侠,在C/S多用户中,你们是如何保证同一数据库同一个表的数据的完整性和一致性的呢?

sunboy_hb 2002-12-12 04:27:36
当多个用户连接到同一数据库使用同一个表时,你们是如何实现数据互锁来保证表数据的一致性和完整性的呢?
...全文
90 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengjian 2003-03-04
  • 打赏
  • 举报
回复
不用想办法。
SQL SERCER 都为你做好了!
你要做的只是保证一个事务有完整性,一个事务尽可能早的提交(commit)或回滚(rollback ),
避免死锁。

一条记录的修改时,其它人是不能修改的,这由SQL SERVER 来做。注意:修改是指commit.而不是你的客户端程序的修改。
数据的一致性,由SQL SERVER的外键来保证,不用自己来做。
所有的关系数据库都很好的保证了这一点的。
mui7788 2003-03-04
  • 打赏
  • 举报
回复
用datawindow的update属性能解决数据一致性问题
hhwhwh 2003-02-27
  • 打赏
  • 举报
回复
在记录上加上状态,处理时加上判断
sunboy_hb 2003-02-22
  • 打赏
  • 举报
回复
有没有更好的专业的方案呢?
sunboy_hb 2003-01-25
  • 打赏
  • 举报
回复
举个例子来说吧,由销售人员起草了一份订单,经理正在查阅审核,这时销售人员又想修改该订单,销售人员修改后并保存,而此时经理还未审核完毕。等审核完后,经理再提交,就会出错或出现数据的不一致。
  我想当经理在审核过程中,不允许销售再修改。

我想这样实现:在每条记录中加上一个LOCKED字段,int型,初始值为0;在数据库中加一个存储过程,它的功能为将LOCKED加1,然后再读locked的值,如果为1,则认为是第一个使用该用户,return true;否则,return false;

在每提取一条记录时,先执行上面的存储过程,如果返回TRUE,则可以修改,否则对该条记录“只读”。
shahand 2003-01-25
  • 打赏
  • 举报
回复
是不是你已经问过了一个
偶觉得可行,即通过向表中改写数据来控制用户操作,如果改写数据比较频繁的话
sunboy_hb 2003-01-25
  • 打赏
  • 举报
回复
我只是要求用户能同时读不能同时写,我也看了DATAWINDOW的UPDATE的SQL代码。现在,我想仿操作系统的机制,在每个表中加入一个LOCK列,来加上“写”锁标志。因为只有开发者才能确定何时是“WRITE”OR "READ ". 不知行否?
  另外,请问,我怎么能获得系统提供的行锁状态,即我如何得到某一表的某一条记录是否已经被用户“占用”?
Chrisma 2002-12-31
  • 打赏
  • 举报
回复
其实很简单,应用事物机制。同时进行的事物只有一个能commit成功。关于行锁的讨论不是完全正确的,还有表锁。要看锁的级别了,缺省是行锁。
newpb80 2002-12-19
  • 打赏
  • 举报
回复
因为sqlserver 为行锁,用sql语句,只要每次只对一行操作,只要不提交,就锁住该行,另一个用户无法对该列执行写操作。用datawindow,无法控制,只能一个成功,一个不成功。
sunboy_hb 2002-12-19
  • 打赏
  • 举报
回复
styker,谢谢。
   正如你所说,我就是要求用户能同时读不能同时写,我也看了DATAWINDOW的UPDATE的SQL代码。现在,我想仿操作系统的机制,在每个表中加入一个LOCK列,来加上“写”锁标志。因为只有开发者才能确定何时是“WRITE”OR "READ". 不知行否?
  另外,请问,我怎么能获得系统提供的行锁状态,即我如何得到某一表的某一条记录是否已经被用户“占用”?
styker 2002-12-17
  • 打赏
  • 举报
回复
你的意思是要求不同用户能同时读写不同的咧?
只能通过where clause来精确控制,但有一点contraint key 或primary key 不允许被同时更改。

你所说的问题可能不一定是行集锁的问题,在sqlserver7.0中,系统已经加入了行集锁的控制。如果不确定,可以用sp_config去查一下。

这种情况,你应该注意将datawindow的update where clause列尽量的精简。
如果你注意datawindow的update操作生成的sql代码,你就会注意到
update 表 set 更新 where 条件
这里条件用来定位数据库中的记录。如果数据库中相关的列值发生变化,无法定位数据,系统就会报入你上面所属的错误信息。


pandge 2002-12-16
  • 打赏
  • 举报
回复
gz
sunboy_hb 2002-12-14
  • 打赏
  • 举报
回复
也就是说如果已经有用户正在修改记录N,则其它用户只读该记录,但是可以修改同一表的其它记录,如何实现呢?
sunboy_hb 2002-12-14
  • 打赏
  • 举报
回复
我是想问如何保证同一表同一记录的完整性和一致性问题,例如:
如果用户1在提取表A数据后修改了数据记录N,但是还没有保存(没有UPDATE,或INSERT)之前,这时用户2也提取了表A的数据并且也修改了数据记录N,然后用户2保存了数据退出。然后,用户1如果保存数据的话,系统就会提示“原数据已经被修改,无法提交修改到数据库”。如何避免这种情况呢?也就是如何实现数据行级别的锁定呢?必须加上一个记录锁状态的数据段吗?不能直接利用MS SQL SERVERR提供的功能吗?
flyhot 2002-12-14
  • 打赏
  • 举报
回复
gz
sunboy_hb 2002-12-13
  • 打赏
  • 举报
回复
我们如何能在程序中检测到现在要修改的表正在被其它用户使用,来限制它不能被修改或删除,用时间戳吗?

按规则,当一个表正在用户使用时,就不允许其它用户对它操作了吗?
esunny 2002-12-13
  • 打赏
  • 举报
回复
XXX
有时要用到表锁,有时用到行锁。
qqf 2002-12-13
  • 打赏
  • 举报
回复
可以呀,客户端只是把服务器的数据提取出来而以,经过修改然后保存的时候才和服务器关联

同意 dongquestion(书山有路勤为径)
realfool 2002-12-12
  • 打赏
  • 举报
回复
ms sql server 7.0自动加数据行锁,我更多是动脑筋解决死锁问题而不是相反。
dongquestion 2002-12-12
  • 打赏
  • 举报
回复
你可在建datawindow时在update属性中选中key and updateable column,以后如果在你修改数据并保存时有别的人已经修改过表,则系统会给你提示
加载更多回复(2)

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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