mysql - 带有许多删除的事务,然后是带有 Hibernate 和 Spring 的许多插入
问题描述
我使用spring boot + MySQL5数据库。
有一个定期服务在运行,需要做以下事务:
- 删除记录(有条件)
- 插入记录
此外,另一个服务确实选择查询,并且应该在不干扰删除+插入事务的情况下看到记录的快照。
我有以下代码:
@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
谢谢您的帮助!
解决方案
推荐阅读
- python - 如何在 python 年龄排序程序中对输入进行排序
- amazon-web-services - 我们可以在 Amazon redshift 中使用 CTAS 创建表时使用压缩吗
- python - 使用 SymPy 消除一个变量以在 Python 中关联两个函数
- mysql - 如何组合数据库以及这是否是数据库设计的最佳方法
- database - Laravel 多级关系
- android - 使用 Android.os.* 类进行 OTA 更新
- excel-formula - 公式帮助:复制单元格,省略单元格中项目前后的文本
- java - libgdx 音频延迟(不到一秒,但很明显)... Java / LibGDX
- azure - Azure REST API 身份验证
- kotlin - 如何在 kotlintest 中使用 beforeProject?