|
如下列代码中,我想一些符条件的数据,先插入tmp_cur_stock临时表中进行计算,并将计算后的结果,进行更新cur_stock 或其它表。
现在为了防止其它用户对cur_stock表中的这些符合条件的行进行删除或修改,如何写红色代码部分的语句啊?有高手指教一下。
--冲抵库存帐,此处忽略了同柜组不同供应商的税率问题
insert into tmp_cur_stock(depart,prov_code,jyfs,code,qty,sum_cost,accept_qty,accept_sum_cost)
select c.depart,c.prov_code,c.jyfs,c.code,c.qty,c.sum_cost,a.qty,(a.qty*a.cost)
from cur_stock c,accept_chi a where a.code=c.code and a.id=as_bill_id
and c.depart=v_depart and c.prov_code='MYSELF' and c.jyfs=ls_jyfs ;
--将库存表更新为抵扣后的状态
update cur_stock set (qty,sum_cost) =
(select cur_stock.qty + tmp_cur_stock.accept_qty,sum_cost + accept_sum_cost from
tmp_cur_stock where cur_stock.code=tmp_cur_stock.code and cur_stock.depart=tmp_cur_stock.depart
and tmp_cur_stock.prov_code = cur_stock.prov_code )
where exists(select 1 from tmp_cur_stock
where cur_stock.code=tmp_cur_stock.code and cur_stock.depart=tmp_cur_stock.depart
and tmp_cur_stock.prov_code = cur_stock.prov_code)
今天突然发现自己从事“银行系统”方面的项目开发已经八年了。不知不觉的八年就这样过去了。想想,有时觉得很快,有时又觉得很慢。对这八年的经历感慨万分。曾经有过激情、有过彷徨、有过失落、有过悲伤。但是后来又逐渐有了自信、有了目标、有了希望。又开始去学习、去拼搏、去奋斗。
好怀念刚毕业进去银行IT领域。与兄弟们一起出差,一起吃饭、一起聊天,经常一起奋斗到晚上12点,没有周末。虽然钱很少,但是我们都很开心,彼此相处的很融洽。后来身边的兄弟们一个个离我而去,新人不断的进来。到最后,我也离开了老东家。我很感谢它,是它把我带入银行IT领域。让我喜欢上这个行业。再一次感谢我的老东家。
银行业务博大精深。它如同少林寺的藏经阁中的72绝技。想精通每一门武学,都要付出艰辛的奋斗。要想融会贯通,那不只需要“武学”上的造诣,同时还需要“道学”上的境界。
八年的时间,以核心系统为主,同时也做过外围。包括中间业务、支付系统、前置系统。因为做核心为主,与很多外围系统都有接口。同时经常与外围系统的兄弟们一起交流、一起学习。补长取短,受益匪浅,学到了很多外围其它系统的整体框架及技术应用。感谢他们!小贴士:本文系 银行IT人“网站创始人海子老师的原创,想参加金融软件工程师培训的朋友,请搜索bankitman或银行IT人。转载时请保留此版权信息。
因为他们,我对银行IT系统中的其它主要系统,如:综合前置、电子银行、理财系统、信用卡、金卡、信贷、IC复合卡,以及数据平台应用系统等有了一定的了解。对我了解全部银行IT系统架构打下了一个良好的基础。我只能说了解,真正的应用还需要我今后不断的努力。
想对初学者分享一下自己八年来的工作经验。
一、做我们这个行业,态度决定一切。记住:要学会如何分析问题、如何解决问题。不要老是奉行“拿来主意”。别人的东西永远不是你的。多以科技人员、业务人员角度去做需求分析。最好让他们按照你的方案去设计。
二、不要频繁的跳槽。我们的圈子很小,我们的东家很少。过多的跳槽对你的发展没有任何好处。
三、多问为什么?多与人交流,多帮助别人回答问题。因为你回答别人的问题。是最好最直接的一种学习进步的好方法。不要吝啬你那点技术。
四、别抱怨东家如何如何差。记住:努力的去学习。“成才之日必定是你跳槽之时”!
五、学习技术、业务、网络、硬件等等,只要与银行IT系统有关的任何东西都值得你去向别人学习。这使得你对银行IT架构的了解有着很好的帮助。只有你了解了系统架构,才能更好更快的学习更多的知识。
六、与同事领导、银行客户搞好关系。
七、以后想到了。再补充给大家。呵呵!
学习来了 行锁定问题 如果你怕数据被改过 可以把需要的数据暂存 如果更新时发现和原来数据不一致就不更新 或者一条SQL?
不懂 帮顶~
原帖由 〇〇 于 2011-9-15 11:24 发表

select for update?
这样可以,建议加上skip locked 即select ...for update skip locked。防止多个session同时锁定一批数据,造成后来的session等待。
感觉一个sql 就可以搞定,楼主为什么要用临时表,搞这么复杂呢。看下我改的这个sql 是否满足你的需求?
UPDATE cur_stock a
SET (qty, sum_cost) =
(SELECT a.qty + c.qty, c.sum_cost + a.qty * a.cost
FROM accept_chi a
WHERE a.code = c.code
AND a.id = as_bill_id)
WHERE c.depart = v_depart
AND c.prov_code = 'MYSELF'
AND c.jyfs = ls_jyfs;
如果能一个sql搞定,就不用考虑行锁定问题了,update自会锁定行。
尽量用一个SQL完成,它能够保证版本一致。
如果实在不行,在合适的地方用UPDATE或SELECT FOR UPDATE加锁。比如你的例子中有UPDATE,看看能否把UPDATE调整到事务的开头来做。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|