求助! 存储过程并发执行的问题 。全部100分奉上 谢谢
初次写存储过程,不知道这样写对不对
库存表a ,id 主键自增 pid 商品id(int) aa 库存量(int) cc 库存状态(int)
id pid aa cc
1 2 20 0
2 3 30 1
存储过程1
begin transaction --- 事物开始
select @i=aa ,@cc=cc from a ROWLOCK where id=@id
if @cc=0
begin
if @i>10
begin
update a WITH(ROWLOCK ) set aa=aa-@b ,@c=aa-@b where id=@id
set @error=@@error+@error
if @c>0
begin
set @state=0 -- 正常更新库存
end
else
begin
set @state=2 --更新的aa 小于等于0时 库存不足 事务回滚
end
end
else
begin
update a WITH(ROWLOCK ) set cc=1 where id=@id
set @error=@@error+@error
set @state=1 --库存小于底线 不允许再出货
end
end
else
begin
set @state=3 --库存小于底线 不允许再出货通知管理员补库存
end
================================================================================================
存储过程2
begin transaction --- 事物开始
update a WITH(ROWLOCK) set aa=aa-@b ,@c=aa-@b where id=@id
set @error=@@error+@error
if @error>0
begin
rollback transaction
end
else
begin
if @c>10
begin
commit transaction --当更新后的库存大于10 可以提交
end
else
begin
rollback transaction
end
end
================================================================================================
存储过程3 ------ 还库存
begin transaction --事务开始
select @i=aa ,@cc=cc from a ROWLOCK where id=@id
if @cc=1
begin
if (@i+@b)>10
begin
update a with(rowlock) set aa=aa+@b ,cc=0 where id=@id
set @error=@@error+@error
end
else
begin
update a with(rowlock) set aa=aa+@b where id=@id
set @error=@@error+@error
end
end
else
begin
update a with(rowlock) set aa=aa+@b where id=@id
set @error=@@error+@error
end
================================================================================================
存储过程4 ----管理员修改库存
begin transaction --事务开始
select @i=aa ,@cc=cc from a ROWLOCK where id=@id
update a with(rowlock) set aa=@b where id=@id
set @error=@@error+@error
================================================================================================
存储过程5 ----普通查询
begin transaction --事务开始
select * from a NOLOCK where id=@id
初次写存储过程,不知道这样写对不对。
实际当中这些存储过程可能是按顺序执行 也可能是多用户并发时执行会发生死锁 这种情况该怎么解决,
希望高手们给改改代码或思路或者重新写该怎么写 谢谢