Несмотря на то, что мой код отличается от вашего, у меня была аналогичная необходимость автоматической фиксации (большинства) транзакций и отката при ошибках.
Большую часть времени мой код содержит простые запросы, которые автоматически откатываютсяПримерно так:
try(Transaction t : database.beginTransaction()) {
return t.selectUnique(Employee.class, "id=?", 200);
} // implicit rollback here
Некоторые базы данных не любят запросы, которые откатываются таким образом, поэтому я решил эту проблему, различая транзакции «запись» и «чтение».Если это транзакция чтения, close () передаст ее, в противном случае откат.Он также проверит, что вы не выполняете никаких действий записи при создании транзакции только для чтения.Теперь я могу написать:
try(Transaction t : database.beginReadOnlyTransaction()) {
return t.selectUnique(Employee.class, "id=?", 200);
} // implicit commit here
В конце транзакции записи все равно должны вызывать себя, но это меньшинство случаев.
Я понимаю, что это не то, что вы просили, но, возможно, это еще полезно.