并发操作控制:在C/S当中如何避免多个用户同时插入同一条记录?
在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




