数据库并发问题!!

赵大明 2006-12-24 03:36:06
SQL Server初学!!
用select isnull(max(PlanID),0)+1 as PlanID from T_Plan_Main
查出这表里面最大的那个PlanID,用这个PlanID作为关键字将数据插入近表中

但是用户多了以后,在我算出最大的PlanID之后别的用户先在这个里面插入PlanID的数据,再往里面插就插不进去了,
也是查出最大编号,和按这个最大编号插入数据,中间有并发错误,请问如何解决,谢谢
...全文
144 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellowork 2006-12-24
  • 打赏
  • 举报
回复
可以使用xlock锁来控制并发操作时生成的PlanID不相同:
create proc spMaxID
as
begin transaction /*启动事务*/
declare @MaxID int
--使用holdlock使锁保持到事务结束,xlock保证事务期间禁止其他用户读取,防止生成相同的PlanID.
select @MaxID = isnull(max(PlanID),0)+1 as PlanID from T_Plan_Main with (holdlock,xlock)
--插入最大值
insert into T_Plan_Main(PlanID) values(@MaxID)
commit transaction /*提交事务,同时自动解锁,以保证其他用户生成新的PlanID*/
GO

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧