Прогресс хранимой процедуры с JPA и MySQL?

#java #mysql #jpa #stored-procedures

#java #mysql #jpa #хранимые процедуры

Вопрос:

У меня есть длительно работающая хранимая процедура в MySQL, которую я вызываю с помощью JPA.

Я хочу периодически информировать пользователя о ходе выполнения процедуры.

Как я могу этого добиться?

Вот что я пробовал. Я создал новую таблицу с именем progress_table, которую я обновляю из хранимой процедуры.

 CREATE PROCEDURE my_proc()
BEGIN
  DECLARE i INT DEFAULT 0;
  
  my_loop: LOOP
    -- Do some heavy work

    SET i = i   1;
    IF i % 100 = 0 THEN
        UPDATE progress_table SET `processed` = i, `last_updated` = NOW() WHERE `id` = 1;
    END IF;
    
    IF i = 10000 THEN
      LEAVE my_loop;
    END IF;
    
  END LOOP;
END
 

Я вызываю хранимую процедуру таким образом:

 (new Thread(() -> {
    em.getTransaction().begin();
    em.createNativeQuery("CALL my_proc()").executeUpdate();
    em.getTransaction().commit();
})).start();
 

Я думаю, это не работает (progress_table не обновляется), потому что до фиксации транзакции ничего не зафиксировано.
Когда процедура завершается, progress_table обновляется с правильным значением.

Я пробовал использовать StoredProcedureQuery, но результат тот же.

Комментарии:

1. Ну, да, идея изоляции транзакций заключается в том, что изменения, внесенные транзакцией, не видны для других сеансов до фиксации транзакции. Вам нужно будет использовать уровень READ UNCOMMITED изоляции, поскольку я не думаю, что есть способ снять блокировку записи в транзакции. В качестве примечания, более актуальный вопрос, который я бы задал себе, заключается в том, почему я все еще занимаюсь программированием БД в 2020 году

2. Спасибо за комментарий. Я ненавижу программирование БД. Я не поклонник наличия бизнес-логики в БД. Единственная причина, по которой я это делаю, — это скорость и потому, что она будет выполнена только один раз. Он выполняется в течение 33 минут для 430 тыс. записей. Может быть, я ошибаюсь в скорости, и с JPA будет то же самое. Увидим сегодня, я собираюсь реализовать тот же логин в Java.