Из документации мы знаем, что
Тайм-аут: как долго выполняется эта транзакция до истечения времени ожидания и автоматического отката базовой инфраструктурой транзакций.
У меня есть код:
@Override
@Transactional(timeout = 2) // 2 seconds
public void someMethod() throws InterruptedException {
System.out.println("Starting to sleep");
Thread.sleep(4000L); // 4 seconds
System.out.println("After sleeping");
someRepository.save(myEntity);
}
Вывод на консоль:
Starting to sleep
After sleeping
Hibernate:
insert
...
transaction timeout expired; nested exception is org.hibernate.TransactionException: transaction timeout expired
TransactionException
в этом случае ожидается результат.
Но если я добавьте атрибут readOnly @Transactional(readOnly = true, timeout = 2)
, исключение TransactionException и вывод консоли:
Starting to sleep
After sleeping
Как видите, без каких-либо исключений нет вставок в БД из-за readOnly = true. Но где TransactionException?
Хорошо, у меня есть одно предположение. Может быть из-за readOnly = true
нам нечего откатывать. Я прав? Не могли бы вы предоставить некоторые доказательства этого предположения? Или, может быть, у вас есть другое объяснение?
Я использую: Spring Boot 2.2.1.RELEASE
MySql 5.5
Hibernate 5.4.8