关于在C/S网络环境下多用户更新数据库的某点困惑.(100分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道,在这种C/S环境下,很容易出现的问题就是:
情况A:
数据库中A字段值为10,B用户向他查询后,在B用户的客户机上就显示为10,B向
他加了5,得到15,就在B向数据库COMMIT 15时,C用户抢先把数据库的A值改为了20,
按理来说,A值正确应为25,可是B客户COMMIT 是15,结果A值变成了15,足足少了10。

小弟的做法是:
1: 给数据库A值加“锁”,在他COMMIT前,禁止C用户修改。
缺点: 如果B用户一直不COMMIT,所有的用户都无法修改该字段,效率极低。

2: 让数据库自己加值,即A= A+N,N为任意数值。且每次修改后,立即COMMIT,
这样在情况A中,尽管C用户抢先修改了A值,但B COMMIT时,因为A值是20,所以
由A=A+N,那么A=20+5,所以数值就不会搞错。
缺点: 老是COMMIT,方法笨,网络传输量大,一些如利用本地临时表,本地缓存
等技术无法使用。
我有点想不通的是,那些利用本地临时表、缓存技术的程序,是如何解决情况A中所说的问
题的?
我知道很多高手是清楚这一点的。所以想请教一下。
我笨笨,请大家见笑。
 
在多用户环境下,设置lock表,是必要的。
在本地先建一个临时表空间,很多开发工具都提供这样的机制。只有当你做commit动作时,
才会向server提交请求,再根据消息排队,去执行;
当然,在对表有动作时,一定要lock它。
lock分为好几种:lock表、lock行等。
 
关注。
我发现PB会自动检查这一点。
》C用户抢先把数据库的A值改为了20,
PB发现A不是原来的10,就报错,拒绝本次修改。这也是一种好的解决方法吧。
 
我是用DELPHI的。
请继续
 
delphi有这种机制,你可用database空间,在属性栏中修改其属性,可将其锁住,
 
212,能说的详细一点吗?
还有一个办法,可以这样:
update table1 set field1 = field1 +5
 
在WhereAll,WhereKeyOnly,WhereChangeOnly中选择第一个,
若提取后值被别的用户更改,提交时会报错,在自己处理错误事件
 
我建议你用DELPHI的DATABASE控件,定制一个事务。
database1.StartTransaction;
try
wiht query1 do
begin
...
end;
except
database1.Rollback;
end;
database1.Commit;

可解决多用户问题。
不明白的话,发MAIL:Ice.yang@263.net
 
D4技术内幕P372.
"当2人或者多人同时访问相同的数据的时候处理并发性问题。可以使用称为TransIsolation
标准的一个事务处理特性。。。。
tiDirtyRead
tiReadcommitted
tirepeatableread
"-----最重要是这句话“关于当一个表被其他用户使用的时候一个数据库的用户如何修改记录
的整个话题是非常复杂的,而且它有几个矛盾的 地方,没有简单的解决方案。在处理这个
~~~~~~
讨厌的问题的时候,可利用前面的TransIsolation层次可以选择解决方案。”
tied..tired..想看书的话来找我:)

 
谢谢大家!
 
千中元:
你的D4内幕是那个电子版的吗?
 
多人接受答案了。
 
后退
顶部