Я использую весеннюю загрузку + базу данных 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 "" Автошоуad ":" pool-3-thread-1 "," X-B3-TraceId ":" 5db000bfb3de1a6d49a53edd707419a0 "," X-B3-SpanId ":" 49a53edd707419a0 "} {" @timestamp ":« 2019-10-23T07:27: 24.318Z "," logLevel ":" DEBUG "," message ":" Открыт новый EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@5a445da1] для транзакции JPA "," service ":" GNSSynchronizer "," instanceId":" 1" , "приложение": "Старт", "пространство": "ngampel", "класс": "org.springframework.orm.jpa.JpaTransactionManager", "нить": "бассейн-3-нитка-1"," X-B3-TraceId ":" 5db000bfb3de1a6d49a53edd707419a0 "," X-B3-SpanId ":" 49a53edd707419a0 "} {" @timestamp ":" 2019-10-23T07: 27: 24.318Z "," logLevel ":" logLevel ":DEBUG " "сообщение": "начать", "сервис": "GNSSynchronizer", "INSTANCEID": "1", "приложение": "Старт", "пространство": "ngampel", "класс":" орг. hibernate.engine.transaction.internal.TransactionImpl "," thread ":" pool-3-thread-1 "," X-B3-TraceId ":" 5db000bfb3de1a6d49a53edd707419a0 "," X-B3-SpanId ":" 49a53edd707419a"@timestamp": "2019-10-23T07: 27: 24.319Z", "logLevel": "DEBUG", "message": "Предоставление транзакции JPA как транзакции JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@241c36b8] " "сервис": "GNSSynchronizer", "INSTANCEID": "1", "приложение": "Пуск", "пробел": "ngampel"," класс":" org.springframework.orm.jpa.JpaTransactionManager " "нить": "пул-3-нить-1", "X-В3-TraceId": "5db000bfb3de1a6d49a53edd707419a0", "X-В3-SpanId":" 49a53edd707419a0"} {" @timestamp ":" 2019-10-23T07: 27: 24.319Z "," logLevel ":" DEBUG "," message ":" удалить из gns_entity, где is_synced = 1 и was_removed = 0 "," service ": "GNSSynchronizer", "INSTANCEID": "1", "приложение": "Старт", "пространство": "ngampel", "класс": "org.hibernate.SQL", "нить": "бассейн-3-thread-1 "," X-B3-TraceId ":" 5db000bfb3de1a6d49a53edd707419a0 "," X-B3-SpanId ":" 49a53edd707419a0 "} {" @timestamp ":" 2019-10-23T07: 27: 25.451Z "," logLe":" DEBUG "," message ":" не удалось выполнить оператор [n / a] "," stackTrace ":" com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: обнаружена тупиковая ситуация при попытке получить блокировку;попробуйте перезапустить транзакцию \ n \ tat sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Nativ
Спасибо за помощь!