二层或三层中,如果数据库中同一条数据很可能在同一时段被多个用户更新,如何设计自己的语句,事务能彻底解决这个问题么(20分)

  • 主题发起人 主题发起人 wjqhyg
  • 开始时间 开始时间
select * from tablename for update <br>锁定。。。如果必要的话,但有些数据库不支持。
 
这样肯定不行!!
 
三层中用公文包模式。你仔细看一下ado的batchupdate方式。,<br>字段A的值为value1,提交时变成value2,而另一个用户在此期间改成了value3,<br>那么在提交时,系统发现字段A的值不是values2,会直接给你报错,告诉你数据已经被修改了之类的错误信息。
 
update tablename set field1 where field1=xxx<br><br>此处xxx 是你预先取出来的,如果是此值,就更新,表是没有客户端更新过.<br>当然有可能是更新过的,只不过也是更新成此值了,你如果需要绝对更新控制的话,可以使用<br>timestamp 就是一个日期时间,先取出,更新时加到where 后面,此值是数据库自动产生,无论insert ,update 都是自动的,所以写<br>select timestamp1 from tablename<br>然后作为参数给where <br>update tablename set field1=xxxzz where timestamp1= :timestamp1_param
 
select timestamp1 from tablename<br>然后作为参数给where <br>update tablename set field1=xxxzz where timestamp1= :timestamp1_param &nbsp;<br>楼上的方法实际上是一种错觉!<br>在select和update之间如果发生了更新。。。update实际上已经不会成功!<br>因为timestamp1 已经被改变!
 
select timestamp1 from tablename<br>然后作为参数给where <br>update tablename set field1=xxxzz where timestamp1= :timestamp1_param &nbsp;<br>楼上的方法实际上是一种错觉!<br>在select和update之间如果发生了更新。。。update实际上已经不会成功!<br>因为timestamp1 已经被改变!
 
“为避免同一时段被多个用户更新”,程序中如何处理?<br>或者说用事务是否可以彻底解决?
 
TClientDataSet提供了一种自动侦测并发更新的方法,可以参看Delphi的Demos。
 
这是丢失更新的问题;google 一下可以找到解决办法
 
如果数据库中同一条数据很可能在同一时段被多个用户更新,如何设计自己的语句,事务能彻底解决这个问题么 ?<br>我问的是这个!!
 
这样的问题对于程序来说是很难解决的,一般只能接受这样的事实,以最后一次更新操作为准。但是,你的程序在网络环境下对于数据库记录的取值确定不应该以你的程序的上下文为准,而应该即时从数据库读取为宜。 当然,好的设计在程序模块划分、权限分配的时候就应该事先考虑到,尽量避免多用户同时更新相同记录的情况。
 
事务解决不了,既然是三层,就不能长时间的锁在事务上,我在上面早说了,用ADO的公文包模式,就可以轻松解决了。ado本身会记录旧的值,如果在更新时该值已经被其他用户更新过,那么ado就会报错了。
 
无论在二层或是三层中,“同一条数据很可能在同一时段被多个用户更新”经常会遇到,如果出现错误,数据库系统会自动引发异常(锁机制等有关),而我们要做的就是扑获这些异常并做相应处理,ADO的公文包模式并不能解决这个问题,你在更新回数据库的时候也会遇到这种情况,虽然说这种几率非常小,但它毕竟是存在的。<br>如果,“同一条数据很可能在同一时段被多个用户更新”这种数据库软件要开发,以二层为例,不涉及三层!!!客户端设计需要注意那些方面?
 
在每個記錄上用一個字段表示 版號<br>開始時為 0, 每改一次加一。<br><br>每次保存時開事務。如果版本不是自己打開時讀出來的那個,就提示出來。要求重新打開編輯
 
我在处理“同一条数据很可能在同一时段被多个用户更新”的方式是:如果出现错误,数据库系统会自动引发异常(锁机制等有关),而我要做的就是扑获这些异常并做相应处理,同时,使用事务。<br>为什么大家的设计五花八门?难道我上面的设计有问题么?
 
sqlserver中用事务加行锁定,update table with(rowlock) set .....没问题,我们程序中就是这样写的,每个医院有200个数用户,还没出现问题,oracle咋加锁就不晓得了
 
ORACLE有支持行级锁定,但MSSQL只支持锁表,要是用三层的话,可以用POOLING进行排队,可以弥补一些不支持行级锁定的RDBMS----------------楼上很多人回答的都不是重点,楼主要解决的是网络环境下多用户的并发操作问题
 
楼上说的很对,我问的是并发如何解决。。
 
这好似不是问题吧,简单的是不同的CLINET在用中间层会有不同的SQL会话,
 
后退
顶部