首页 > 解决方案 > 带有许多删除的事务,然后是带有 Hibernate 和 Spring 的许多插入

问题描述

我使用spring boot + MySQL5数据库。

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

  1. 删除记录(有条件)
  2. 插入记录

此外,另一个服务确实选择查询,并且应该在不干扰删除+插入事务的情况下看到记录的快照。

我有以下代码:

@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)
            {

            }
        }
    }
}

一般来说,它似乎工作得很好..虽然很多时候都会出现死锁异常,我不知道为什么..

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

我不时收到以下错误:

DEBUG","message":"创建名为 [com.ddd.swiss.microservices.gnssynchronizer.BulkInsert.save] 的新事务:PROPAGATION_REQUIRED,ISOLATION_DEFAULT","service":"GNSSynchronizer","instanceId":"1", "application":"Start","space":"ngampel","class":"org.springframework.orm.jpa.JpaTransactionManager","thread":"pool-3-thread-1","X-B3 -TraceId":"5db000bfb3de1a6d49a53edd707419a0","X-B3-SpanId":"49a53edd707419a0"} {"@timestamp":"2019-10-23T07:27:24.318Z","logLevel":"DEBUG","message" :"为 JPA 事务打开了新的 EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@5a445da1]","service":"GNSSynchronizer","instanceId":"1","application":"Start","space":"ngampel","class":"org.springframework.orm.jpa.JpaTransactionManager","thread" :"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-B3-SpanId":"49a53edd707419a0"} {"@timestamp":"2019-10-23T07:27:24.319Z","logLevel":"DEBUG", "message":"将 JPA 事务公开为 JDBC 事务 [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@241c36b8]","service":"GNSSynchronizer","instanceId":"1","application": "开始","空格":"ngampel","class":"org.springframework.orm.jpa.JpaTransactionManager","thread":"pool-3-thread-1","X-B3-TraceId": "5db000bfb3de1a6d49a53edd707419a0","X-B3-SpanId":"49a53edd707419a0"} {"@timestamp":"2019-10-23T07:27:24.319Z","logLevel":"DEBUG","message":"从 gns_entity 中删除 is_synced=1 和 was_removed=0","service":"GNSSynchronizer","instanceId":"1","application": "开始","空格":"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","logLevel":"DEBUG","message":"无法执行语句 [n /a]","stackTrace":"com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: 尝试获取锁时发现死锁;尝试重新启动事务\n\tat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Nativ

谢谢您的帮助!

标签: mysqlspringhibernatedeadlock

解决方案


推荐阅读