iteye_5745 2013-05-21 10:29
浏览 298
已采纳

关于数据查询前插入数据问题

如果有个业务场景:
比如有张库存表 inv,有个字段物料 material,有个字段数量 qty,当然还有ID。
每次入库,先查找库存是否有这个物料,如果有的话,则数量需要加上去,如果不存在,需要生成一条这样的记录,包含物料以及数量。

我只是打个比方,这个在一般系统里面都会初始化的,没个物料都有一条默认的数量为0的记录,我就不说了。

如果不能初始化,我需要动态的添加,则情况如下,比如 M1物料入库10公斤
如果存在 就数量加 不存在就新加一行
if(inv exists 'M1') {
update inv set qty=qty+10 where material='M1'
}else{
insert inv (material,qty) values ('M1',10)
}
如果并发的话,比如 人员A、B同时做入库单
A 执行 查看 exists 时间为t1
B 执行 查看 exists 时间为t2
A 执行 查看 insert 时间为t3
B 执行 查看 insert 时间为t4
t1<t2<t3<t4,如果刚好遇到这样的情况,大家查的时候都不存在,每个人都入了,怎么办,处理这种情况,这样导致物料M1存在2条数据,当然 可以对物料进行唯一索引,但是这样B插入就会报错,请问大家有什么办法让这种情况不发生,不能唯一索引,也不能lock table,谢谢

  • 写回答

2条回答

  • blusewang 2013-05-21 17:57
    关注

    1:必须采用事务,否则会出现丢失更新的情况。
    2:在并发情况下,如何设计这个事务。
    2.1:数据库有默认的锁机制,就像我们执行一条简单的“update table set .... where ...”,数据库会瞬间加排他锁,其它所有的操作等待。
    2.2:数据库加锁时间取决于数据库的设计以及程序处理事务的方法,尽可能的减少事务执行时间。

    3:解决办法
    3.1:开始事务,读加排他锁
    3.2:判断并执行插入或更新操作
    3.3:提交事务

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集