在C/S 或者MIDAS中,如何实现并发和锁定

nanhui 2003-03-02 01:15:22
如果有两个客户端同时对同一行数据进行修改操作,我如何控制只让首先执行的客户修改数据,而后面的客户报错!
我是直接采用SQL语句来修改数据的。
数据库采用的是Oracle,客户端开发工具用的是C++Builder

我曾经看过ORACLE的一点资料,知道有锁定这种用法(包括乐观、悲观等锁定)。请问我如何才能实现锁定。即当有某一个人在修改A数据表的第I行数据。这时不允许另一个用户操作这一行数据。

或者还有更好的方法来解决上述问题!!

谢谢各位了!!!
...全文
82 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaohu 2003-06-19
  • 打赏
  • 举报
回复
正如jiezhi(西域浪子) 所说的:“那是办不到的”
其实完全可以这样做:(比较土)
你在提交更新数据的时候连同原来存在本地的
更新之前的数据一起上传
在数据更新的时候
首先比较原来的数据和数据库中相应的数据比较一下,
如果一样则允许更新
否则表明已经有另外的客户端更新了该数据

^-^
nanhui 2003-03-02
  • 打赏
  • 举报
回复
developer2002(开发者2002) :
那请问如何才能实现行级锁,进而自动引发阻塞。
nanhui 2003-03-02
  • 打赏
  • 举报
回复
midas中的TClientDataSet控件是将记录集取到本地操作
developer2002 2003-03-02
  • 打赏
  • 举报
回复
应该来说,oracle支持行级锁,系统会自动判断是否有两个或两个以上的事务对同一行进行操作,若有,会自动引发阻塞。但不清楚midas这类的控件是将记录集取到本地操作的?学习。。。
xiaosan_616 2003-03-02
  • 打赏
  • 举报
回复
可以在你的客户端使用c的锁,开发最好在数据库外实现同步,ORACLE有自带锁的机制,一般不用自己管。
nanhui 2003-03-02
  • 打赏
  • 举报
回复
developer2002(开发者2002) :
我刚才根据你跟我说的做了两个实验,但结果不太满意。
第一个实验是用sqlplus来同时修改两行数据,第一个sqlplus修改某一行数据,但未提交。这时这二个sqlplus也修改这一行数据,此时第二个sqlplus阻塞了(好像是死了)。然后第一个sqlplus提交数据,这时数据库中的数据发生变化了。
我的问题是:我如何把第二个sqlplus的阻塞解除??

第一个实验是用我的Client来同时修改两行数据,(服务器端的autocommit设置为false)第一个Client修改某一行数据,但未提交。这时这二个Client也修改这一行数据,此时第二个Client和服务器都阻塞了(好像是死了)。然后第一个Client提交数据,这时数据库中的数据**并没有变化**。
我的问题是:我如何把第二个Client及服务器的阻塞解除??要不然一旦发生这种情况那应该就是一种BUG了吧


jiezhi 2003-03-02
  • 打赏
  • 举报
回复
那是办不到的.
数据通常都是被取到本地,然后进行操作,完毕后再更新到数据库里面去.
你需要的就是写一些出错处理,比如提示:记录丢失,记录已经被其他用户修改等等.

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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