首页 > 其他分享 >多线程下带事务的删除大量数据引起的锁等待超时

多线程下带事务的删除大量数据引起的锁等待超时

时间:2022-11-16 11:13:02浏览次数:33  
标签:insert 事务 多线程 下带 baseMapper sysUsers SysUser 超时 sysUser

 @Override
    @Transactional(readOnly = false,propagation = Propagation.REQUIRES_NEW) //我建议不要用这个注解,他是声明式事务粒度过大,建议用使用编程式事务,可控性高
    public void generate() {
        //删除数据没有提交,然后操作其他
        /**
         * 这是我参考stackoverflow上的。我猜测也是这样的,删除事务没有提交,然后操作插入,造成锁等待引起的死锁
         * 一个线程进来锁表操作删除数据,恰好还没有提交数据让数据更新,紧接着其他线程进来准备操作,发现被之前的线程锁住了
         * 他就等待其他线程释放锁,结果循环操作等待,大家都不释放锁相互占用资源。
         * 解决方案:主动释放资源或者结束等待。
         * 数据库事务隔离级别:通过此查出 SELECT * FROM information_schema.INNODB_TRX;-》REPEATABLE READ可重复读,可改为 commit
         * ‘Lock wait timeout’ occurs typically
         * when a transaction is waiting on row(s) of data to update
         * which is already been locked by some other transaction.
         * 1.缩小事务范围还是不能解决问题
         * 2.事务失效,不能用try catch
         */
        //经老夫排查有137页 ,每页1000条数据,引起删除超时,并非后面for循环,因为我的事务没有加在函数名上,我用局部事务,当时去了@Transactrionnal 也不行
       long t1 =  System.currentTimeMillis();
//            transactionTemplate.execute(p->{
                baseMapper.delete(Wrappers.emptyWrapper());
//                return null;
//            });



        //日常检查
      
        List<SysUser> sysUsers = sysUserService.selectUserList(SysUser.builder().roleKeys(roleKeys).build());
        for (SysUser sysUser : sysUsers) {
          //公司业务,我省了
            baseMapper.insert(ltThreeCenterTeam);
        }


        //街道管理
     for (SysUser sysUser : sysUsers) {
         
            baseMapper.insert(ltThreeCenterTeam);
        }

        //处置单位
        //市政
      for (SysUser sysUser : sysUsers) {
      
            baseMapper.insert(ltThreeCenterTeam);
        }

        //环卫
   for (SysUser sysUser : sysUsers) {
           
            baseMapper.insert(ltThreeCenterTeam);
        }

        //绿化
       for (SysUser sysUser : sysUsers) {
           
            baseMapper.insert(ltThreeCenterTeam);
        }
        long t2 =  System.currentTimeMillis();
        System.out.println( "耗时------------------"+(t2-t1));//耗时------------------51422
    }

我去除了

 @Transactional,使用粒度小的
 transactionTemplate.execute(p->{
                baseMapper.delete(Wrappers.emptyWrapper());
                return null;
            });
都不行,最后加大了锁等待超时时间才行的

#查询锁等待时间,默认为50s
show GLOBAL VARIABLES like 'innodb_lock_wait_timeout'

set GLOBAL innodb_lock_wait_timeout=500

 

网上也有一种解决方案,删除分批。我的业务暂时不太适应那种方式



标签:insert,事务,多线程,下带,baseMapper,sysUsers,SysUser,超时,sysUser
From: https://www.cnblogs.com/wangweiip/p/16895178.html

相关文章

  • 有趣的 Go HttpClient 超时机制
    hello,大家好呀,我是既写Java又写Go的小楼,在写Go的过程中经常对比这两种语言的特性,踩了不少坑,也发现了不少有意思的地方,今天就来聊聊Go自带的HttpClient的超时机制......
  • 异步和多线程有什么区别
    一、异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法。 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至......
  • C#多线程之高级篇(上)
    前言抛开死锁不谈,只聊性能问题,尽管锁总能粗暴的满足同步需求,但一旦存在竞争关系,意味着一定会有线程被阻塞,竞争越激烈,被阻塞的线程越多,上下文切换次数越多,调度成本越大,显然......
  • 多线程等待
    多线程等待温故而知新,好久没有用到,突然忘记 方法一CountDownEvent类usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usi......
  • 超时时间内执行方法 ActionCall.CallWithTimeout
    publicclassActionCall{/*例子*staticvoidMain(string[]args){//trythefivesecondmethodwitha6secondtimeout......
  • 【Azure 服务总线】Azure.Messaging.ServiceBus 多次发送消息报超时错误,是否可以配置
    问题描述使用AzureServiceBus,提供应用程序之间松耦合的消息交换,但是有时候发送消息多次出现超时错误。Aconnectionattemptfailedbecausetheconnectedpartydid......
  • python 多进程 多线程 协程
    多进程-进程池1fromconcurrent.futuresimportProcessPoolExecutor23withProcessPoolExecutor(max_workers=10)asexecutor:4results=executor.map......
  • ActiveMQ经典的使用模式(利用多线程处理消费端)
    今天看视频,里面讲了一个经典的例子,是工作中很常用的,特此将这种模式记录下来.这个例子使用了ActiveMQ的选择器,也使用了之前学的自定义线程池.队列的使用,而且很好的利......
  • 响应式编程(反应式编程)的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)
    响应式编程的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)文章目录​​响应式编程的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)​​​​简介​​​​......
  • Java多线程(一)
    一.线程的生命周期及五种基本状态关于Java中线程的生命周期,首先看一下下面这张较为经典的图:   上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知......