情景描述:有一个材料表(TbeA),包括某类材料个数,材料名称等;
如:水晶头,个数为20个有一个材料使用表(TbeB):包括使用某个申请单用到的材料如:
工单001,使用材料名称为水晶头的材料,使用个数为5个那么有个可有材料的查询结果为:
其中有一条记录为:水晶头,可用个数为15个
那么现在有a, b两个人因为维修设备的原因需要领取材料(水晶头)
其中a,需要领取8个水晶头,
b需要领取4个水晶头但是a,b两个人可能同时打开领取的界面,这时他们都要领取材料水晶头;
在表单上要填写领取的数量,a填写8个,b填写4个,
填写的过程中要进行领取数量的校验;校验准则是:填写的领取材料的数字不能大于水晶头的可用数量(20-5)=15,即首先填写的人要<=15
但是如果两个人都同时打开界面,读取到的可用数量都是15,而如果a通过填写领取了8个,并提交了表单。
则:可用数量就只剩下7个了;可:b界面上(如果不刷新)则仍然显示的是15而不是8个,这样在填写领用数量的时候就会出错;因为此时还是校验的15而不是8
这种情况怎么办呢?通过文本框填写的blue事件,可以通过异步获取到最新的可用数,但是如果当a在通过读取数据表中的可用数量后,b此时领用了4个,那么这个时候a获取的可用数量又不对了,应该是11个而不是15了。我的这种推断是否合理。
如果通过事务控制将如何处理?还请各位高人指点

解决方案 »

  1.   

    A 和 B 同时打开页面 取到相同的数据 , A操作了数据库 ,B页面虽然没刷新 ,但是你B页面操作数据库也是要发送请求到服务器的, 这时候服务器再获取数据 , 然后再进行相应的操作。没问题的啊。
      

  2.   

    关键是这个可用数量,在打开页面的时候就展示出来 了。
    如果a,b两人在一个时间内都打开了查询材料的界面,
    他们都会显示在界面上是15的可用数量;而我们很多的判断都是基于这个15进行的;
    另外如果当a填写可用数量的时候,库里还有15个,
    那么他现在填写了8个,
    不过还未提交这个事务。
    此时b也进行了可用数量判断,后台是15,因此它也可以填写8个。
    填写完成后提交了事务;此时库中应该只有7个可用数量了而这时a,也提交事务,不过现在已经不再验证可用数量了。它的8个也提交了,那么现在的可用数量就为-1,逻辑上不通啊。这种情况大家是怎么控制的?
    需要在提交的时候再次进行验证可用数量吗、?
      

  3.   

    虽然你页面显示的还是有15个数量 , 但是你操作 , 虽然在页面判断是通过了 , 但是你要操作数据库,还是要发送请求到后台的啊 , 在后台也会判断啊, 如果我说的不是你要的那个意思 , 那你也可以用hibernate的乐观锁 , 给材料表添加一个版本号 。
    比如他们取的时候 版本号都为 5 ,A修改了数据库 , 版本号变成6了 , B再去修改数据库的时候,数据库的版本号已经为6的,但是他读取的时候版本号为5 ,这样就不会让他修改成功 。
      

  4.   

    spring jdbcTemplate有乐观锁的东西没有啊?
    没有用hibernate
      

  5.   

    这个要在提交的时候进行判断,虽然a和b同时显示15,但可以在提交的时候判断数据库的剩余数量和xx填写的数量,如果后者大于前者提示一下就ok,比如说,你慢了 哈哈