多线程导致事务失效-记一次性能优化

优化背景:项目中有一个批量更新的方法,由于代码逻辑是逐个调用数据库进行更新,导致在更新数量多的情况下,整个方法执行慢。

正常业务情况下,更新的数量能达到500个,假设更新一个耗时为100ms,那么500个需要的时间为50秒,用户肯定等不了那么久,需要优化。

一开始想法是,开启多线程去更新,一个线程执行一个sql更新,我便动起手来,发现用多线程效果确实还可以,500个数据库更新耗时大概3秒。喜笑颜开。

 

然而,后面分析这个改动会带来的影响是:

原来这是一个事务方法,在使用多线程之后,那么这些批量更新就不在同一个事务了,那么可能存在某个线程中某个执行异常了,但是其他线程中的任务依然提交成功,就达不到事务的效果了。

(事务状态基于threadlocal来保存,不同线程那么threadlocal则不同)

 

那么如果解决上面遇到的问题呢?

刚开始想到两个方法:

方法一 : 让这些线程共用同一个事务,那么则需要自定义一个事务管理器,(这个个人感觉比较麻烦),只是有这个想法,还未去实现。

方法二:让这500个sql更新操作,变成一个批量更新的sql,减少网络传输的耗时。

 

最终使用了方法二,优化执行效率同时也保证了事务。

 

posted on 2019-12-23 17:08  swave  阅读(6119)  评论(0编辑  收藏  举报

导航