多人同时访问数据库问题一问!(200分)

同意shbjkl的说法,我也是这样做的,把生成ID的
算法放在“保存数据过程”中执行,这样冲突的可
能性就会小很多。
 
客户端1000左右
 
同意娃娃的观点....
>我现在的解决方法是建立一个号码库,使用一个删除一个,删
>除数据后就把该数据记录使用的号码增加进号码库,只用一个
>触发器,在删除时发现记录少于多少个时就自动再按顺序生成
>一些号码增加进去。
 
同意shbjkl
 
如何避免多个用户同时保存时,该序列号要不重复?请给出详细方案,谢谢.
 
taninsh:
你在INSERT之后其它用户也INSERT了,那你select @@IDENTITY 回来的就不对了?
 
把获取和加一操作放到一个事务中即可!
 
老大你是不是做医院系统的病案号,哈哈,很简单的,首先建立一个不连续号码库,用于
收集不连续号码,自动加1可以采用上面各位兄台的任意一种,但是select max(id) 这种要
小心不但效率底,而且还要控制锁,否则很容易重复,indentity也很难控制,使用触发器也许
是一个好办法,或者干脆自己建立一个序列号库,好控制一点,而且好移植,单要注意数据库
事务锁级别要使用读锁(如果不明白,你得找本书看看),你写一个不连续号码收集程序,
每周叫你得客户运行一下,每次你Insert的时候先看一下不连续号码库是否有号,取一个
删一个,如果没号就调用自动加1的过程
哈哈
 
1、如我上面所说的建立一个号码库
2、把你要使用这个号码的库相应的号码字段设为键值,不能重复
3、在提交数据的时候,把获取号码和保存数据放在同一个事务中,
假设真的那么巧,在这零点几秒里有人获取了一个和你相同的号
码并且提交,那肯定会有一个提交不了(因为数据库后端的键值
限制),肯定有一个用户的数据要回滚,再重新提交了。

过程就是这样,我想你能考虑到这一点,应该代码不用再让我写了吧。
 
如何通过在SQLSERVER中设置锁的级别实现该业务要求?
 
可以按照娃娃说的那样,建一个号码库,插入值1-1000,然后写一个存储过程来实现你的业务,
里面包含一个事务:
declare
@id int
begin transaction
--step 1
select @id= min(id) from id_table
--step 2
insert into yourtable (id) where id = @id
if @@error <> 0 then
begin
rollback transaction
return
end
--step 3
delete from id_table where id = @id
if @@error <> 0 then
begin
rollback transaction
return
end
commit transaction

注意,第2步不要和第3步调过来,因为可能会有2个以上用户同时执行了第一步,但只能有
一个用户成功执行第2步,因为yourtable定义了id为主键。
 
最好是在用户保存时返回最大号,当用户下一次保存时,再从数据库中取一次最大号使用,
这样可以避免重复。
 
sorry,第2步搞错了,应该是 insert into yourtable (id) values (@id)
 
多人接受答案了。
 
顶部