В целом я согласен с подходом @MichaelLange.Но, возможно, отдельная таблица - это слишком много ... В вашей таблице импорта может быть дополнительный столбец completed
, который, если задано значение "ложь", то запись принадлежит файлу, который обрабатывается сейчас (или не удалось обработать).После обработки файла вы запускаете простое обновление для этой таблицы (не должно произойти сбой, поскольку у вас нет никаких ограничений для этого столбца):
update import_table set completed = true where file_name = "file001_chunk1.txt"
Перед обработкойВ файле вы должны удалить «устаревшие» записи:
delete from import_table where file_name = "file001_chunk1.txt"
Это решение будет быстрее и проще для реализации, чем вложенные транзакции.Возможно, при таком подходе вы столкнетесь с блокировками таблиц, но при соответствующем выборе уровня изоляции это можно минимизировать.При желании вы можете создать представление для этой таблицы, чтобы отфильтровать незавершенные записи (включить индекс в столбце completed
):
create view import_view as select a, b, c from import_table where completed = true
В общем, я думаю, что вложенные транзакциив этом случае это невозможно, поскольку чанки могут обрабатываться в параллельных потоках, каждый из которых содержит свой собственный контекст транзакции.Менеджер транзакций не сможет запустить вложенную транзакцию в новом потоке, даже если вам каким-то образом удастся создать «основную транзакцию» в «верхнем» потоке работ.
Еще один подход - продолжение"временной таблицы".Процесс импорта должен создать таблицы импорта и присвоить им имена, например, по дате:
import_table_2011_10_01
import_table_2011_10_02
import_table_2011_10_05
...
etc
и «super-veiw», который объединяет все эти таблицы:
create view import_table as
select * from import_table_2011_10_01
union
select * from import_table_2011_10_02
union
select * from import_table_2011_10_05
После успешного импорта «суперпредставление» должно быть воссоздано.
При таком подходе у вас возникнут трудности с внешними ключами для таблицы импорта.
Еще один подход -использовать отдельную базу данных для импорта, а затем передать импортированные данные из базы данных импорта на главную (например, передать двоичные данные).