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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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