@Stateless
public class ProcessService {
@Inject
private HelloService helloService;
@Inject
private FooService fooService;
public void process() {
helloService.select(); // OK -> SELECT
helloService.insert("Hello 1"); // OK -> INSERT
try {
fooService.unsafe(); // Some unknown exception (eg. RuntimeException) -> INSERT
} catch (Exception e) {
System.out.println("Catch exception and continue");
}
fooService.select(); // ERROR -> `STATUS_MARKED_ROLLBACK`
fooService.insert("Hello 2"); // ERROR -> `STATUS_MARKED_ROLLBACK`
}
}
Если helloService.insert()
или fooService.insert()
сгенерировать исключительную транзакцию, это должен быть откат, поэтому я не могу пометить ее как REQUIRES_NEW
. Также я не могу пометить helloService.unsafe()
как REQUIRES_NEW
, потому что другие службы используют этот метод и нуждаются в REQUIRED
.
Как решить эту проблему?
Моя идея заключается в том, чтобы извлечь некоторые логики c из HelloService
и FooService
в классы, помеченные как ApplicationScoped
, и внедрить их в HelloService
, FooService
и ProcesService