在并发事务中加锁的示例代码

来源:互联网 发布:联合大数据有限公司 编辑:程序博客网 时间:2024/05/22 17:48
create table stock(material int,quantity int)--库存表
insert stock select 1,100 union all select 2,20
create table stock_out(id int identity,material int,quantity int)--出库单表
go
--出库表插入触发器,用于检查可用库存,并更新库存表减库存。
create trigger tr_stock_out_i on stock_out
for insert
as
begin
 set nocount on
 if exists(select 1 from inserted _i join stock _s with(updlock) on _s.material = _i.material
  where _i.quantity > _s.quantity
 )
 begin
  raiserror('库存不够!',16,1)
  rollback tran
  return 
 end
 else
 begin
  waitfor delay '00:00:05'--模拟并发事务
  update _s set _s.quantity = _s.quantity - _i.quantity
  from stock _s join inserted _i on _i.material = _s.material
 end
 
end
go
--如果不加锁,在两个连接中分别执行
waitfor time '15:12'
insert stock_out(material,quantity)
select 1,100
--然后
select * from stock where material = 1
--得
/*
material    quantity
----------- -----------
1           -100
库存出现负数,因为sql执行的顺序为
连接1检查库存,满足
连接2检查库存,满足
连接1减库存,减到0
连接2减库存,减到-100
检查库存与减库存这两个动作之间必须是无缝的,所以在检查库存时要加更新锁。
更新锁是自排斥的,并且与共享锁兼容,它会保持到事务结束即insert语句最外层的事务结束。
*/
go
drop table stock,stock_out
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打开时全屏不知变成小屏怎么办 苹果6s原装数据线不充电怎么办 vivo手机安卓系统耗电快怎么办 电视机机顶盒插了电源开不了怎么办 苹果手机更新系统后老是闪退怎么办 16g苹果6s手机内存不足怎么办 苹果以前浏览器页面忽然没了怎么办 白衬衣被别的衣服染了怎么办 把宝贝标题改了没访客了怎么办 微信公众号看不到评论时间了怎么办 微店退款退货买家发空快递怎么办 微信二维码收款顾客少付款了怎么办 江西高考二本差5分上线怎么办 湖南文科考生二本上线差两分怎么办 在商场试鞋自己鞋子被偷怎么办 网易账号忘记密码更换手机了怎么办 一人在外地钱花光了怎么办 银行卡被公安冻结卡里的钱怎么办 在店铺不上班了押工资了怎么办? 在银座的押金拿不出来怎么办 唯品会退货时快递单号填错了怎么办 天猫店铺快递已发到不了怎么办 中邮消费贷没审核通过怎么办 房贷扣款日忘存钱了怎么办 农业银行卡输密码次数超限载怎么办 农业银行卡丢了不知道卡号怎么办 银行卡短信扣费失败怎么恢复怎么办 歌华有线遥控器点了tvav怎么办 一级注册结构延续注册晚了怎么办 在京东买的黄金项链买贵了怎么办 京东上面买的商品不符合实际怎么办 在京东买东西卖家迟迟不发货怎么办 淘宝商家买的货一直不到怎么办 国美买的格力空调发票丢了怎么办 国美实体店发票丢了怎么办 我在苏宁买的冰箱发票丢了怎么办 信用卡家庭电单位电话换了怎么办 常住户囗和实际住址没房子怎么办 退货淘宝极速退款 卖家拒收怎么办 淘宝退货极速退款后卖家拒收怎么办 蘑菇街付款成功怎么申请退款怎么办