执行一个出仓的操作该如何写?平时我是这么写的,首先看看剩余数量select shengyu into temp from table1 where mid=xxx;如果大于指定数量那么执行出仓if temp >= 100 then
update table1 set shengyu=shengyu-100 where mid=xxx;
commit;
end if;但是如果这些语句并发执行的话,应该是有可能出错的,当剩余100时,两个事务同时去select,那么temp都大于等于100,于是都减去100,那剩余就小于0了,与事实不符。我的想法是,当我select时就应该将记录锁住,不让其他的事务去读该记录,只有当该事务完毕之后才释放锁。
但不知道怎么写啊,请各位指教。
update table1 set shengyu=shengyu-100 where mid=xxx;
commit;
end if;但是如果这些语句并发执行的话,应该是有可能出错的,当剩余100时,两个事务同时去select,那么temp都大于等于100,于是都减去100,那剩余就小于0了,与事实不符。我的想法是,当我select时就应该将记录锁住,不让其他的事务去读该记录,只有当该事务完毕之后才释放锁。
但不知道怎么写啊,请各位指教。
解决方案 »
- 多个or条件不走索引,求解
- oracle 如何查询所有的,自定义角色
- 安装完express后SQL Plus出现乱码咋办呀?急
- oracle连informix, help me,太偏太难,分不够再给.高人进
- 紧急求助!!在线等待
- java中执行oracle存储过程的问题
- dmp 文件怎么转换
- 请教:如何备份oracle数据库,小弟初学,有些搞不明白
- 关于alter type ....谢谢!
- 连接oracle数据库显示The Network Adapter could not establish the connection
- 拿到一个很复杂的sql语句,请问该如何分析它呢?
- 请问,使用Proc/c++如何实现备份与恢复
update前面加一个:
select * from table1 where mid=xxx for update;
2
或者
update table1 set shengyu=shengyu-100 where mid=xxx and shenyu=temp; 这样改一下也以