sql 事务中查询(急用)

1988525 2014-08-25 12:48:33
有一个表a 表中有 最大值(int) 和年份2个字段,

下面执行事务中每次都要根据年份取最大值然后+1这个值,然后在下面的添加语句中把最大值给一个字段赋上
然后更新这个表a 的最大值改为最新的

现在的问题是 程序可能很多人操作,当有人同时点击提交按钮时,就出现最大值那个字段是重复的,感觉是查询最大值+1 那个sql语句没有走事务,不知怎么处理这种情况,事务本身应该是一个提交中另一个不能执行,请教这里应怎么写
...全文
334 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxum 2014-08-25
  • 打赏
  • 举报
回复
用事务加锁比较好
中国风 2014-08-25
  • 打赏
  • 举报
回复
猜一个
BEGIN TRY

DECLARE @Nr INT			--号码
   ,@YY VARCHAR(50)		--年份两位
UPDATE  a
SET     @Nr = Nr = Nr + 1
WHERE   YY = @YY

IF @@ROWCOUNT=0
	BEGIN
		INSERT INTO a(Nr,YY)values(1,@YY)
		SET @Nr=1
	END
END TRY
BEGIN CATCH 
	RAISERROR (N'取号失败',16,1)
END CATCH
Tiger_Zhao 2014-08-25
  • 打赏
  • 举报
回复
BEGIN TRAN

UPDATE 表a
SET 最大值=最大值+1
WHERE 年份=2014 -- 这就锁住了

SELECT @v = 最大值
FROM 表a
WHERE 年份=2014

-- 把@v给一个字段赋上

IF 成功
COMMIT TRAN
ELSE
ROLLBACK TRAN --这就避免了加了1又不用的情况

你原先 表a.最大值 表示下一个可用值,现在是上一个已用值。
如果介意的话就使用 @v-1 好了。
专注or全面 2014-08-25
  • 打赏
  • 举报
回复
liuxum 2014-08-25
  • 打赏
  • 举报
回复
我看按照你的要求用HOLDLOCK 持有共享锁这个级别的就差不多应该。
rubynle 2014-08-25
  • 打赏
  • 举报
回复
declare @value int Begin tran select @value=maxvalue from a where 年份='2014' update a set maxvalue=@value+1 where 年份='2014’ commit
liuxum 2014-08-25
  • 打赏
  • 举报
回复
参照http://blog.sina.com.cn/s/blog_6857a06f0100m48l.html
1988525 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 liuxum 的回复:
用事务加锁比较好
举个例子呗 不太明白锁
1988525 2014-08-25
  • 打赏
  • 举报
回复
举个例子呗 不太明白锁

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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