我使用的是mysql数据,有时会出现共享冲突
列举如下(同一个程序片段):1 得到取库存的请求
2 查询库存数量,如果库存不够返回报告错误
3 数据库事务开始
4 做相关从数据库操作,比如更改订单状态,记录明细账,如果服务器稍微慢点,可能要花一点时间
5 事务结束,没有数据库操作错误就宣告成功,如果有书库库操作错误,事务回滚。现在问题出现了,我在众多操作中,有极少部分出现了负库存。分析原因是,当我的流程通过了2,进入3时。当3还没有执行结束,即库存还没有减下来,立即有另外进行在进行2了,检测到进有库存(实际上等上一个任务结束后,库存就没有了。)就在这个时间差,产生了错误。按照事务处理理论,如果用程序处理,我可以设定一个全局变量,在有任何进程进行到2及以后时,不让任何程序进来,直到解锁。但我想用另外一种方式,即不使用全局变量对功能模块进行锁定,直接把数据库的事务提前,即采用如下流程1 得到取库存的请求
2 数据库事务开始
3 查询库存数量,如果库存不够返回报告错误
4 做相关从数据库操作,比如更改订单状态,记录明细账,如果服务器稍微慢点,可能要花一点时间
5 事务结束,没有数据库操作错误就宣告成功,如果有书库库操作错误,事务回滚。这样,在理论上能够杜绝共享冲突吗?
即当有进程进行到3,开始一系列操作时,所涉及到的表是不是已经被锁定了。其它进程即使要在地3步查询数据库,也必须等到第一个进程执行完?求解,这对我的程序相当重要,因为这是低概率事件,平时测试不出来。除非用的人非常多,悄悄两个进程一先一后挨得很紧。不知道我描述清楚没有。如果不清楚可以回帖问,谢谢。

解决方案 »

  1.   

    简单的说。进程1的执行时间如下:第1ms:数据库事务开始:
    第3ms:查询库存为 1  
    第5ms:减库存操作
    第7ms:库存变为 0 ,操作结束同时,进程2在第2ms到达系统:
    第2ms:数据库事务开始(这时,系统会不会因为表被)
    第4ms:查询数据库(这时,进程1实际上因为处理其它事情还没有减少库存,是不是表被锁定进程2要等待,或宣布对表锁定失败,还是不等待,直接查询库存还是1,重点在这里)
    。。
    。。