TransactionManagerException:事务不是该线程的当前事务
TransactionManagerException: Transaction is not current for this thread
我正在尝试将 CSV 文件中的一些数据加载到干净的数据库实例中。我通过使用 Apache Camel 创建一个 ETL 过程来做到这一点,它读取输入 CSV,将文件分成多行,并使用每行一个事务并行处理每一行。
class 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 密码或 Neo4j 导入工具,因为在制作原型时使用 OGM 非常方便。但是现在我在 OGM 生成这个 TransactionManagerException 的过程中间发现了一堵墙,看起来这是管理事务的一些线程问题。
at com.cartrawler.service.CountryImportSpecification.Should 能够导入国家 csv(CountryImportSpecification.groovy:9)
由以下原因引起:org.neo4j.ogm.exception.TransactionManagerException:此线程的事务不是最新的
在 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)
谢谢你,好心
路易斯·奥斯卡
关闭并行处理,因为事务仅为单线程。
我正在尝试将 CSV 文件中的一些数据加载到干净的数据库实例中。我通过使用 Apache Camel 创建一个 ETL 过程来做到这一点,它读取输入 CSV,将文件分成多行,并使用每行一个事务并行处理每一行。
class 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 密码或 Neo4j 导入工具,因为在制作原型时使用 OGM 非常方便。但是现在我在 OGM 生成这个 TransactionManagerException 的过程中间发现了一堵墙,看起来这是管理事务的一些线程问题。
at com.cartrawler.service.CountryImportSpecification.Should 能够导入国家 csv(CountryImportSpecification.groovy:9) 由以下原因引起:org.neo4j.ogm.exception.TransactionManagerException:此线程的事务不是最新的 在 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)
谢谢你,好心 路易斯·奥斯卡
关闭并行处理,因为事务仅为单线程。