关于数据库并发问题

qq554006164 2015-10-31 04:39:54
这是一个商品下单的代码,并发时出现订单数量超过了商品的数量
我测试发现执行查询商品的

DECLARE @num INT
SELECT @num=number FROM product WHERE id=1 --查询商品的库存数量

BEGIN TRAN
DECLARE @count INT
SELECT @count=COUNT(1) FROM [order] WHERE pid=1--查询商品的订单数量

IF(@count<@num)
BEGIN
INSERT INTO [order]([pid],[uid])-插入订单
VALUES(1,@uid)
END
COMMIT
...全文
125 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2015-11-06
  • 打赏
  • 举报
回复
SELECT @num=number FROM product WHERE id=1 --查询商品的库存数量 --这时,别的进程可能买走了一部分商品 BEGIN TRAN 。。。
专注or全面 2015-10-31
  • 打赏
  • 举报
回复
把查询条件放在事物中,并且加上锁提示
DECLARE @num INT
BEGIN TRAN 
DECLARE @count INT
 
BEGIN
SELECT @count=COUNT(1) FROM [order] with(updlock,holdlock) WHERE pid=1--查询商品的订单数量
  
IF(@count<@num)
 
    INSERT INTO [order]([pid],[uid])-插入订单
    VALUES(1,@uid)
END
COMMIT
专注or全面 2015-10-31
  • 打赏
  • 举报
回复
序列化的隔离级别都控制不住,不可能吧? 在已提交读格力级别下,这种方式肯定可以控制住


DECLARE @num INT
SELECT @num=number FROM product WHERE id=1 --查询商品的库存数量
 
BEGIN TRAN 
DECLARE @count INT

BEGIN
SELECT @count=COUNT(1) FROM [order] with(updlock,holdlock) WHERE pid=1--查询商品的订单数量
 
IF(@count<@num)

    INSERT INTO [order]([pid],[uid])-插入订单
    VALUES(1,@uid)
END
COMMIT

xiaoxiangqing 2015-10-31
  • 打赏
  • 举报
回复
可以通过一个中间表来处理
qq554006164 2015-10-31
  • 打赏
  • 举报
回复
我试了4种事务隔离级别,在查询时都不能把表锁住。。

22,206

社区成员

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

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