このような機能を別々のスレッドで実装することを提案します。つまり、ネストされたトランザクションで開始するメソッドは、別々のスレッドで開始するだけです。次のような擬似コードのように見える場合があります。
//SomeService
// Here we start an external transaction
@Transactional
int processAllInTransaction() {
List<Integer> jobIds = jobService.getJobs();
if (!jobIds.isEmpty()) {
new Thread(new Runnable() {
@Override
public void run() {
jobIds.forEach(jobId ->
//Execute eveything in external transaction
threadPool.execute(jobId)
);
}
}).start();
}
return jobIds.size();
}
//Method of Executor Service
void execute(final int jobId) {
tasks.add(taskExecutor.submit(new Runnable() {
void run() {
someProcessor.processJob(jobId);
}
}));
}
//Method of another Service
@Transactional
public void processJob(int jobId) {
//this will work in separate thransaction since was executed in another Theread
someDao.doWorkInExternalTransaction(jobId);
}
本当に外部トランザクションを制御する必要がある場合-新しいThereadの単一の外部トランザクションでネストされたトランザクションの作業を行い、スレッドから返される結果を待ち、必要に応じて例外をスローします