How To Check That Transaction Timeout And Rollback At Expiration Works As Expected
Note: Do not test transaction timeout via Thread.sleep()! This is not working! Rely on two transactions and exclusive locks or even better rely on SQL sleep functions (e.g., MySQL, SELECT SLEEP(n) seconds, PostgreSQL, SELECT PG_SLEEP(n) seconds). Most RDBMS supports a sleep function flavor.
Description: This application contains several approaches for setting a timeout period for a transaction or query. The timeout is signaled by a specific timeout exception (e.g., .QueryTimeoutException). After timeout, the transaction is rolled back. You can see this in the database (visually or query) and on log via a message of type: Initiating transaction rollback; Rolling back JPA transaction on EntityManager [SessionImpl(... <open>)].
Key points:
- set global transaction timeout via
spring.transaction.default-timeoutin seconds (see,application.properties) - set transaction timeout at method-level or class-level via
@Transactional(timeout = n)in seconds - set query timeout via JPA
javax.persistence.query.timeouthint in milliseconds - set query timeout via Hibrenate
org.hibernate.timeouthint in seconds
Note: If you are using TransactionTemplate then the timeout can be set via TransactionTemplate.setTimeout(n) in seconds.

