#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.