CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

并发操作控制:在C/S当中如何避免多个用户同时插入同一条记录?

楼主xjl(...)2002-12-01 14:32:06 在 Delphi / VCL组件开发及应用 提问

在C/S结构当中如何避免多用户同时插入同一条记录?  
  假设有多个用户都可以录入记录,但是记录不可重复(没有设在主键约束里)  
  一个用户刚刚插入一条记录,还没有提交,而另一个用户同时也插入这条记录  
  (他首先查询有没有这条记录,如果没有则插入),于是我们不期望出现事情出现了  
  (同一条记录在表里插入了两次),如何搞定?  
  我用Delphi的控件的事务(事务本身是不是有锁的机制?)试了一个简单的例子,好像不行,是不是该手动加锁?又该如何加?  
  谢谢了 问题点数:200、回复次数:25Top

1 楼stanely(俺是邢她汉子)回复于 2002-12-01 14:39:52 得分 5

upTop

2 楼bingjiling(销售)回复于 2002-12-01 14:41:00 得分 5

与非c/s   一样  
  先查一下,再添加所定  
  Top

3 楼xjl(...)回复于 2002-12-01 14:47:05 得分 0

怎么加锁(手动?)  
  我加了以后好像不对Top

4 楼wafeijian(韵杰〖痛并快乐着……〗)回复于 2002-12-01 14:59:37 得分 5

主键用数字字串.  
  保存时检坦是否存在,若存在则加1,   直到找到一个不存在的主键值,保存后再返回  
  提示给用户.  
   
  Top

5 楼xjl(...)回复于 2002-12-01 15:03:41 得分 0

楼上好像不行  
  我的主键是数字ID(自增长的),所以不存在楼上的一说  
  而且即使那样我的那个问题依然存在呢Top

6 楼cuihl(存在即是合理)回复于 2002-12-01 15:06:04 得分 15

每个用户都用一个事务处理就可以了Top

7 楼xjl(...)回复于 2002-12-01 15:07:37 得分 0

楼上说的如果是用delphi控件的事务好像是不行(我还特意试了一下)  
  数据库服务器的事务我正在试.....  
  未果Top

8 楼SilveryFox(一天一点爱恋......)回复于 2002-12-01 15:16:09 得分 30

在RDBMS数据库系统中,存在稳定的事务处理机制,如oracle,sqlserver,db2等,能够对数据库中提交前后数据进行校验,保证其完整性及唯一性,如果存在两条相同记录,则会出现异常  
   
  S   Q   L数据库采用所谓的优化锁定策略。这种技术并不限制访问当前正在被其他用户访问的记录,可以照常对它进行编辑,并请求服务器保存修改后的数据。不过,在记录被保存之前,首先会与服务器中的备份进行比较,因为在查看和修改这条记录的同时,它可能已被其他用户更新。  
  如果该记录已被其他用户修改,则会导致一个错误,提示在取得记录后,它已经被更新。作为一个开发人员,在设计客户程序时应该考虑到这一点,客户/服务器程序尤其要注意到这种情况,而在桌面数据库中就不会发生。Top

9 楼xjl(...)回复于 2002-12-01 15:20:16 得分 0

楼上的好像还没说到我的关键哦~~~Top

10 楼xjl(...)回复于 2002-12-01 15:22:31 得分 0

该死,我加一个锁退不出来了,表给锁定了该死  
  begin   transaction    
  insert   into   date   with   (updlock   tablock)   (datetime)   values   ('2008-9-9')  
  如上,我为了查看锁的情况没有提交,现在表给锁定了,各种操作也不行了  
  怎么办?Top

11 楼cnsuyong(小可)回复于 2002-12-01 15:35:44 得分 60

对于处于较长时间(比如可能超过1秒)处于编辑状态的记录实施锁定是不可取的。更何况忘记解锁将会带来更多麻烦。  
   
  解决方案:  
  (1)如果对新增数据一定要先插入行再编辑最后再提交,那么可以在插入行之后立刻提交,从开始编辑到最后提交作为一个单独事务。  
  (2)使用序列。或者通过数据库来实现序列管理。  
  (3)新行数据完全准备好之后一次添加新行,让事务占用时间尽可能短。  
  (4)避免不同的用户新增相同的数据。(例如把用户ID作为主索引字段之一)Top

12 楼zwhhoo(我爱真理)回复于 2002-12-01 16:04:16 得分 10

用存储过程来判断是否重复。Top

13 楼txliu(凡仁大虾)回复于 2002-12-01 16:06:57 得分 0

对这种方式下只能用存储过程来判断是否重复并写入Top

14 楼xjl(...)回复于 2002-12-01 16:16:54 得分 0

嗯,用存储过程是一个可行的办法Top

15 楼Anajian(天行者)回复于 2002-12-01 16:26:41 得分 5

关注,Top

16 楼xjl(...)回复于 2002-12-01 16:50:43 得分 0

to   cnsuyong(小可)  
  >>(2)使用序列。或者通过数据库来实现序列管理。  
  到现在我还没明白序列指的是什么,能否明白一些?  
  Top

17 楼blazingfire(烈焰)(对.net极度憎恨中....)回复于 2002-12-02 09:02:06 得分 5

用事务处理。  
  Top

18 楼xjl(...)回复于 2002-12-02 09:04:51 得分 0

楼上说明白一点?  
  Top

19 楼marf_cn(吗啡)回复于 2002-12-02 09:12:16 得分 10

在应用服务器端用MTS,可以获得事务处理能力。Top

20 楼towndream(努力学习)回复于 2002-12-02 10:11:52 得分 10

下策办法:定义标志,标志打开时,允许用户对数据表操作,同时关闭标志,操作完毕后标志打开;标志关闭时把数据表操作加入序列即可。Top

21 楼SnowTopCh(哆来咪)回复于 2002-12-02 11:04:50 得分 30

如果是使用的是SQL   Server,请把插入记录作一个Stored   Procedure,让所有的复杂处理交给数据库服务器处理,可以在Stored   Procedure中设定一些返回值。这个方法比自己编程加锁处理好多了。我以前也是习惯什么处理都在程序中解决,后来发现交给数据库解决更好,工作量小得多,而且健壮型也很好。Top

22 楼xjl(...)回复于 2002-12-02 11:53:37 得分 0

前面同志说的序列指什么?  
   
  看来用存储过程是共识?Top

23 楼stdcall(学习者)回复于 2002-12-03 08:55:52 得分 5

用触发器是不是可以解决这个问题!Top

24 楼god263(Max)回复于 2002-12-03 09:08:59 得分 5

学习中。。。。。Top

25 楼xjl(...)回复于 2002-12-03 14:29:46 得分 0

大家讲讲事务方面的?  
  我很是不懂中....Top

相关问题

  • C/S控制并发问题
  • 在C/S结构中程序中创建临时表将统计数据插入,然后检索显示,是否会有并发问题
  • C#中的数据插入问题
  • C#插入数据库的password问题
  • C#的Excel插入问题。(郁闷中!)
  • 关于 C++ 中的并发和同步问题
  • @@@@C#线程池的并发问题,高手进@@@@
  • 关于C/S的多用户并发问题!(SPT)
  • c语言中如何建立队列实现并发运行
  • c语言如何实现队列并发运行?

关键词

  • 数据库
  • 用户
  • 服务器
  • 数据
  • 解决
  • 记录
  • 插入
  • 序列
  • 事务
  • 提交

得分解答快速导航

  • 帖主:xjl
  • stanely
  • bingjiling
  • wafeijian
  • cuihl
  • SilveryFox
  • cnsuyong
  • zwhhoo
  • Anajian
  • blazingfire
  • marf_cn
  • towndream
  • SnowTopCh
  • stdcall
  • god263

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo