Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用Hibernate和Spring执行多次删除后再执行多次插入的事务_Mysql_Spring_Hibernate_Deadlock - Fatal编程技术网

Mysql 使用Hibernate和Spring执行多次删除后再执行多次插入的事务

Mysql 使用Hibernate和Spring执行多次删除后再执行多次插入的事务,mysql,spring,hibernate,deadlock,Mysql,Spring,Hibernate,Deadlock,我使用springboot+MySQL5数据库 有一个定期服务正在运行,需要执行以下事务: 删除记录(带条件) 插入记录 此外,另一个服务确实选择查询,并且应该在不干扰delete+insert事务的情况下查看记录的快照 我有以下代码: @Service public class BulkInsert { public static final String DELETE_ALL_ROWS_QUERY = "DELETE FROM GnsEntity where is_synced =

我使用springboot+MySQL5数据库

有一个定期服务正在运行,需要执行以下事务:

  • 删除记录(带条件)
  • 插入记录
  • 此外,另一个服务确实选择查询,并且应该在不干扰delete+insert事务的情况下查看记录的快照

    我有以下代码:

    @Service
    public class BulkInsert
    {
    
        public static final String DELETE_ALL_ROWS_QUERY = "DELETE FROM GnsEntity where is_synced = true and was_removed = false";
    
        @Inject
        private EntityManager entityManager;
    
        @Transactional
        public void save(List<GnsEntity> gnsEntityList)
        {
            Session session = entityManager.unwrap(Session.class);
            Query entity = session.createQuery(DELETE_ALL_ROWS_QUERY);
            entity.executeUpdate();
            for (int i = 0; i < gnsEntityList.size(); ++i)
            {
                try
                {
                    session.persist(gnsEntityList.get(i));
                }
                catch(NonUniqueObjectException nonUniEx)
                {
    
                }
            }
        }
    }
    
    @服务
    公共类舱壁嵌件
    {
    public static final String DELETE_ALL_ROWS_QUERY=“DELETE FROM GnsEntity where is_synced=true,was_remove=false”;
    @注入
    私人实体管理者实体管理者;
    @交易的
    公共作废保存(列表GnsitityList)
    {
    Session Session=entityManager.unwrap(Session.class);
    查询实体=session.createQuery(删除\u所有\u行\u查询);
    entity.executeUpdate();
    对于(int i=0;ipersist(gnsEntityList.get(i));
    }
    catch(ununiqueObjectException ununiex)
    {
    }
    }
    }
    }
    
    总的来说,这似乎效果不错。。虽然很多时候会出现死锁异常,但我不知道为什么

    这就是为什么我想知道我的代码是否相对良好

    我偶尔会遇到以下错误:

    调试“,”消息“:”创建名为的新事务 [com.ddd.swiss.microservices.gnssynchronizer.BulkInsert.save]: 需要传播、隔离、默认设置、服务:“GNSSynchronizer”、“instanceId”:“1”、“应用程序”:“开始”、“空间”:“ngampel”、“类”:“org.springframework.orm.jpa.JpaTransactionManager”、“线程”:“pool-3-thread-1”、“X-B3-TraceId”:“5db000bfb3de1a6d49a53edd707419a0”、“X-B3-SpanId”:“49a53edd707419a0”} {“@timestamp”:“2019-10-23T07:27:24.318Z”,“日志级别”:“调试”,“消息”:“已打开” 新实体管理器 [org.hibernate.jpa.internal。EntityManagerImpl@5a445da1]JPA “事务”、“服务”:“GNSSynchronizer”、“instanceId”:“1”、“应用程序”:“开始”、“空间”:“ngampel”、“类”:“org.springframework.orm.jpa.JpaTransactionManager”、“线程”:“pool-3-thread-1”、“X-B3-TraceId”:“5db000bfb3de1a6d49a53edd707419a0”、“X-B3-SpanId”:“49a53edd707419a0”} {@timestamp:“2019-10-23T07:27:24.318Z”,“logLevel:“DEBUG”,“message:“begin”,“service:“GNSSynchronizer”,“instanceId:“1”,“application:“Start”,“space:”ngampel”,“class:“org.hibernate.engine.transaction.internal.TransactionImpl”,“thread:”pool-3-thread-1”,“X-B3-TraceId:“5db000bfb3de1a6d49a53edd707419a0”,“X-b3id:”49a53edd707419a0“}” {“@timestamp”:“2019-10-23T07:27:24.319Z”,“日志级别”:“调试”,“消息”:“公开” JPA事务作为JDBC事务 [org.springframework.orm.jpa.vendor.HibernateJpaDialect]$HibernateConnectionHandle@241c36b8]“,”服务“:”GNSSynchronizer“,”实例ID“:”1“,”应用“:”开始“,”空间“,”ngampel“,”类“:”org.springframework.orm.jpa.JpaTransactionManager“,”线程“:”池-3-thread-1“,”X-B3-TraceId“:”5db000bfb3de1a6d49a53edd707419a0“,”X-B3-SpanId“:”49a53edd707419a0”}” {“@timestamp”:“2019-10-23T07:27:24.319Z”,“日志级别”:“调试”,“消息”:“删除” 来自gns_实体,其中_同步=1,且 was_removed=0,“service:“GNSSynchronizer”,“instanceId:“1”,“application:“Start”,“space:“ngampel”,“class:“org.hibernate.SQL”,“thread:“pool-3-thread-1”,“X-B3-TraceId:“5db000bfb3de1a6d49a53edd707419a0”,“X-B3-SpanId:“49a53edd707419a0”} {“@timestamp”:“2019-10-23T07:27:25.451Z”,“日志级别”:“调试”,“消息”:“可能” 不执行语句 [n/a],“stackTrace”:“com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: 尝试获取锁时发现死锁;请尝试重新启动 事务\n\t sun.reflect.nativeConstructor附件mpl.newInstance0(Nativ


    感谢您的帮助!

    仅供参考,此服务运行需要多长时间,何时运行?@TimBiegeleisen当delete+insert运行时,大约需要1分钟。.它使用spring的调度执行运行,完成后等待3分钟。insert在哪里?session.persist()您提到您的定期事务和只读服务,但鉴于您的定期查询正在检查条件是否已同步并已删除,是否存在对修改这些列的数据的额外访问权限?仅供参考,此服务运行需要多长时间,何时运行?@TimBiegeleisen当delete+insert运行大约1分钟时,它将运行spring的schedule执行,完成后等待3分钟insert在哪里?session.persist()您提到了您的定期事务和只读服务,但鉴于您的定期查询正在检查条件是否已同步并已删除,是否存在对修改这些列的数据的额外访问权限?