遇到一个小并发问题
场景:
并发环境下,审批业务方法中含有更新数据和其他业务处理,受同一事务管理,尽管用了乐观锁(带状态更新),两个线程同时获得了相同状态得数据,所以乐观锁避免不了。并且由于事务未提交,两个线程同时更新同一条数据(带条件->行级锁)会导致更新数据的表发生死锁
解决办法:
从锁方面下手:
使用RetreenLock可重入锁,对公共业务方法通过业务id方式获取锁(因为是公共方法,不能直接对方法加锁,只是不允许对同一条数据同时更新,但是可以对同一张表的不同数据进行更新),将业务id作为key,锁对象作为value,如果一个线程进来,查看是否创建锁,如果没有则新创建一把锁,如果已经创建了则获取创建过的锁,在获取锁的过程中,如果锁已经释放,则获取锁,如果没有释放,则说明另外的线程在占用,直接抛出异常并给出友好提示,这里不建议设置超时时间或重试,因为从业务角度上是不允许重复对一条数据做更新的,如果设置超时重试,如果锁释放被第二个线程获取到了,会对业务和性能造成不必要的影响。
从业务角度下手:
直接捕获死锁异常,抛出异常提示,但是得补货详细异常并给出友好提示。
从事务下手:
因为该业务方法是在工作流当中,不确定事务管理分割情况,不建议从事务处理角度出发
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
