一个死锁的问题
北京-小北 2015-01-21 11:10:28 先描述下业务场景.
系统会生成单据号,单据号需要按一定规则连续递增. 方法A实现了这个规则.(最新单据号会存在数据库,A方法需要更新数据库)
系统多个模块都需要用到方法A, 所以在方法A用了synchronized 修饰.
各模块运行正常. 现在需求发生变更. 需要支持单据的批处理.
就出现以下场景.
当线程T1执行方法B进行批处理时,循环10次调用方法A,
线程T2执行方法C进行单条处理.
T1线程的B方法执行5次后,T2线程的C方法获取到了锁,开始执行,需要更新数据库,但是线程B方法事务还没提交,还占用了数据库的锁,方法C就开始等待. 这时方法B因为无法获得到A的锁,剩余次数无法执行,
程序陷入死锁.
求怎么解决?
目前的解决方案有 锁粗化.即将锁加在方法B,C上. 但是类似方法B,C这种,在几十个类中,改动非常大.
有没有简单点的方法呢?