Mysql 使用Hibernate和Spring执行多次删除后再执行多次插入的事务
我使用springboot+MySQL5数据库 有一个定期服务正在运行,需要执行以下事务: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 =
@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;i persist(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()您提到了您的定期事务和只读服务,但鉴于您的定期查询正在检查条件是否已同步并已删除,是否存在对修改这些列的数据的额外访问权限?