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


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

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

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

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

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

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

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

    刚开始想到两个方法:

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

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

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

  • 相关阅读:
    关于width属性max/min-content和fit-content
    director.js实现前端路由
    第一篇博文
    AtCoder Beginner Contest 120 题解
    AtCoder Beginner Contest 121 题解
    AtCoder Beginner Contest 115 题解
    Python中list的复制及深拷贝与浅拷贝探究
    Python中print()函数不换行的方法
    高斯消元法的C++简单实现
    Python中list作为默认参数的陷阱
  • 原文地址:https://www.cnblogs.com/swave/p/12084771.html
Copyright © 2020-2023  润新知