请教大虾:由触发器引发的并发问题

chencang 2009-04-27 02:43:28
我用VS 2005 开发WinForm 的库存管理程序
出库时会建立出库单,然后从数据库检索出库存>0的物资记录加入该出库单,最后输入出库数量保存,这样客户端任务结束
数据库中,出库单明细表上建立了Insert、Update、Delete触发器,用以修改被出库的物资的库存余量

现在碰到数据一致性问题:
当两个操作者同时检索出某个物资(例:A物资,库存数100),并进行出库。甲、乙分别输入出库数量(例:80 和 50)并保存。
此时,经由触发器,A物资库存余量为-30,错误!!

问大虾:如何更好的解决这个并发问题?(尽量不能使用共享锁,也就是说允许同时读取库存数)
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Garnett_KG 2009-04-27
  • 打赏
  • 举报
回复
这个你在Trigger中判断一下就行了.



IF EXISTS(
SELECT *
FROM 库存 a,
(
SELECT 物资编号,SUM(出库数) as TotalQty
FROM inserted b
GROUP BY 物资编号
) b
WHERE a.物资编号=b.物资编号
AND a.库存-b.TotalQty <0
)
ROLLBACK TRANS



gomoku 2009-04-27
  • 打赏
  • 举报
回复

你的触发器难道不检查物资库存余量非负吗?
如果触发器返回错误,则用户乙出库的时候,提示库存不足就可以了。

(适用于允许有脏数据,客户可以容忍偶尔重新输入的情况)
chencang 2009-04-27
  • 打赏
  • 举报
回复
TO:1楼
用事务+SQL 可以把 触发器 的功能替代,要想解决并发,还得加 更新 锁吧?
lvxianda 2009-04-27
  • 打赏
  • 举报
回复
用事务+SQL怎么实现?
wartim 2009-04-27
  • 打赏
  • 举报
回复
用事务+SQL,不要用触发器

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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