Транзакция с большим количеством удалений, сопровождаемая множеством вставок с Hibernate и Spring - PullRequest
1 голос
/ 23 октября 2019

Я использую весеннюю загрузку + базу данных 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 "" Автошоу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

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...