Тайм-аут атрибута @Transactional не работает с атрибутом readOnly = true - PullRequest
1 голос
/ 30 апреля 2020

Из документации мы знаем, что

Тайм-аут: как долго выполняется эта транзакция до истечения времени ожидания и автоматического отката базовой инфраструктурой транзакций.

У меня есть код:

@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

1 Ответ

0 голосов
/ 01 мая 2020

Две вещи, которые вас смущают:

  1. тайм-аут в спящем режиме применяется с момента запроса действия из базы данных.
  2. Thread.sleep (4000L) пауза на 4 секунды, но в приложении.

Так что, если вы хотите увидеть использование тайм-аута, вы можете добавить запрос, который занимает более 2 секунд в процесс, который будет выполнять действие, поскольку, поскольку вы действительно понимаете эти 4 секунды сна, оно не учитывается, поскольку hibernate понимает правило 2 секунд, которое вы добавили с момента вызова hibernate вашей вставки.

...