最近遇到一个问题,在操作SQL更新账户余额时,常常发现更新后的余额与实际的不相符,马上想到了是不是存在并发更新,一查果然如此。之前也曾遇到过这样的问题,当时没太在意,现在是解决的时候了。用Mysql模拟了一下这个过程:创建两张表,paralltable和parallalter,每次根据paratable表更新parallalter表,有如下几条逻辑
① parallProcess.jsp页面接收parall.jsp传过来的值,首先向paralltable插入一条记录,同时用paralltable的id,num,向parallalter表插入一条新记录;
② 之后parallProcess.jsp准备更新刚插入的paralltable记录,随之用更新后的paralltable的id,num,向parallalter表插入一条新记录,但在更新之前,先人为的设置一个延时,在延时期内执行并发操作③ ;
③ 从parall2.jsp页面向parallProcess2.jsp页面传值,在parallProcess.jsp延时期内,更新①中向paralltable插入的记录,同时用更新后的paralltable的id,num,向parallalter表插入一条新记录;
④ 执行完③的操作后,立刻执行②的操作。
如此的话,就会发现本来③是在②完全执行后,对paralltable进行更新,结果由于并发操作,③的更新结果丢失了,这种问题在SQL操作中经常发生。不知大家有在遇到这种问题时,是如何解决的。
附:模拟程序见 http://download.youkuaiyun.com/source/2389003