TransactionManagerException: транзакция не актуальна для этого потока

Я пытаюсь загрузить некоторые данные из файла CSV в чистый экземпляр БД. Я сделал это, создав процесс ETL с использованием Apache Camel, он читает входной CSV-файл, разделяет файл на несколько строк и обрабатывает каждую строку параллельно, используя одну транзакцию в строке.

класс ImportRouteBuilder расширяет RouteBuilder {

private final Importer importer
private final String endpoint

public ImportRouteBuilder(Importer importer, String endpoint) {
    this.endpoint = endpoint
    this.importer = importer
}

@Override
void configure() throws Exception {
    from(endpoint)
            .unmarshal(buildCsvDataFormat())
            .split(body())
            .parallelProcessing()
            .bean(importer)
}

private static CsvDataFormat buildCsvDataFormat() {
    CsvDataFormat csv = new CsvDataFormat();
    csv.skipHeaderRecord = true
    csv
}

}

@Slf4j
@Service
class CountryCsvImporter implements Importer {
   @Autowired
   private CountryRepository countryRepository

   @Autowired
   private Session session

   @Override
   void process(List record) {
       Transaction tx = session.beginTransaction();
       try {
          importCountry(record)
          tx.commit()
       }catch (Throwable t) {
          tx.rollback()
     }
     tx.close()
    }

Я сделал это, потому что не хотел использовать LOAD CSV cypher или инструмент импорта Neo4j, пока моя модель все еще развивается, поскольку очень удобно использовать OGM при прототипировании. Но теперь я обнаружил стену в середине процесса, когда OGM генерирует это TransactionManagerException, похоже, это была какая-то проблема с потоками, управляющая транзакциями.

at com.cartrawler.service.CountryImportSpecification. Должна иметь возможность импортировать csv страны (CountryImportSpecification.groovy:9) Причина: org.neo4j.ogm.exception.TransactionManagerException: транзакция не является текущей для этого потока< /em> на org.neo4j.ogm.session.transaction.DefaultTransactionManager.rollback(DefaultTransactionManager.java:78) на org.neo4j.ogm.transaction.AbstractTransaction.rollback(AbstractTransaction.java:65) на org. neo4j.ogm.drivers.embedded.transaction.EmbeddedTransaction.rollback(EmbeddedTransaction.java:60) в com.cartrawler.service.CountryCsvImporter.process(CountryCsvImporter.groovy:28)

Спасибо, любезно Луис Оскар


person Luis Trigueiros    schedule 05.05.2016    source источник
comment
Я дважды пытался исправить форматирование вашего вопроса, просто чтобы его было легче читать, но вы продолжаете менять его обратно. Если вы хотите исправить это самостоятельно, узнайте, как сделать отступ ваш код и трассировки стека.   -  person cybersam    schedule 06.05.2016


Ответы (1)


Отключите параллельную обработку, поскольку транзакция выполняется только в одном потоке.

person Claus Ibsen    schedule 06.05.2016
comment
Привет, Клаус, мне удалось заставить импорт работать параллельно, когда я перешел на весенние данные и запустил импортер из очереди seda. - person Luis Trigueiros; 16.05.2016
comment
@ClausIbsen Означает ли это, что одновременный доступ к базе данных невозможен? Как отключить параллельную обработку? - person Poliakoff; 26.10.2016