#java #jdbc #transactions #fitnesse
#java #jdbc #транзакции #fitnesse
Вопрос:
Мы пытаемся исправить некоторые проблемы в тестовом жгуте и проблемы с конкретным тестом, который в основном проверяет функцию, которая создает объект, выполняет некоторую обработку и сохраняет ее в базе данных (да, C в CRUD).
В разделе демонтажа теста fitnesse мы выполняем оператор delete для этой записи. Однако ничего не удаляется.
Мы подозреваем, что это может быть связано с тем, что удаление выполняется до SUT
фиксации транзакции. Следовательно, удалять нечего.
Чтобы попытаться исправить это, мы удаляем опрашиваемый jdbc:
java.sql.Statement statement;
/*creates a statement*/
do{
recordsDeleted = statement.executeUpdate("delete...");
Thread.sleep(INTERVAL);
}while(recordsDeleted == 0);
Итак, здесь возникают вопросы:
-
Когда выполняется транзакция jdbc?
В приведенном выше коде будут ли обновления выполняться в одной и той же транзакции или будет создаваться новая транзакция для каждой итерации цикла do-while? (Я склонен думать, что они будут выполнены в одной транзакции, поскольку
java.sql.Connection
содержит методыcommit
,rollback
,etc
). -
Можете ли вы предложить другое решение этой проблемы? Я бы подумал, что это довольно распространенное явление, но мои товарищи по команде не нашли никакого решения в Интернете, только предложение «опрос до его удаления или тайм-аута».
Ответ №1:
Я не вижу ничего плохого в вашем цикле изначально. Вы звоните statement.close()
куда-то правильно? Я предполагаю SUT
, что он находится в другом потоке или удален? Вы уверены, что ваши критерии удаления соответствуют вводимым данным? Можете ли вы проверить базу данных в другом процессе, чтобы узнать, попадает ли create в базу данных?
Что касается транзакций, это зависит от базы данных, но обычно транзакций по умолчанию нет. Обычно включена автоматическая фиксация, поэтому каждый отдельный оператор выполняется и фиксируется немедленно. Если вы хотите включить транзакции, вам нужно отключить автоматическую фиксацию, а затем вызвать databaseConnection.setSavePoint()
. Транзакция фиксируется при commit()
вызове. Если соединение закрыто (или rollback()
вызвано), транзакция откатывается.