日期:2014-05-17  浏览次数:20495 次

SQL 锁问题
    现在有一个问题请教各位大神。

    我有一个需求。数据库中有一个职工表,其中有个int型的ID字段。在程序中添加员工时,要点击‘检测ID’按钮获取数据中最大的ID并加一形成最新的ID。
    列子:假设数据库中职工表的最大ID为135,那么我点击‘检测ID’按钮之后得到的新ID就是136。
    

    但是问题就出现了,假设多个人同时点击'检测ID'按钮,获得的最新ID都是一样的。
    列子:假设数据库中职工表的最大ID为135,那么多人同时点击‘检测ID’按钮之后得到的新ID都是136。

    我想要的效果是在甲点击‘检测ID’获取到新ID之后,后面的用户就无法获取到最新ID。要等甲完成新增操作之后,后面的用户才能获取到最新的ID。

    请问能否用SQL中的锁之类的方法解决这个问题,或者说其他什么方法。


    

------解决方案--------------------
参考一下我的文章:http://blog.csdn.net/dba_huangzj/article/details/7685162
------解决方案--------------------
之前也看到论坛中,有你说的方法,就是先求max,然后加1,这种方法,在大量并发操作的时候,

就会出现你说的那种获取的id都是一样的。

可以考虑这样,新建一个表:


create table tb_id(tb_name varchar(100),currval int,status int)

insert into tb_id
values('xxx',表中当前的最大值,0)



然后每次,都要先更新这个表:
begin tran

declare @currval int


update tb_id
set status = 1,
    @currval = currval,
    currval = currval + 1
where status = 0 and tb_name = 'xxx'

--使用id
insert into xxx
values(@currval)

update tb_id
set status = 0,
where status = 1 and tb_name = 'xxx'

commit tran