package br.com.stackspot.nullbank.withdrawal; import org.hibernate.LockOptions; import org.springframework.data.jpa.repository.*; import org.springframework.stereotype.Repository; import javax.persistence.LockModeType; import javax.persistence.QueryHint; import javax.transaction.Transactional; import java.util.Optional; @Repository public interface AccountRepository extends JpaRepository { /** * Loads the entity even when a lock is not acquired */ @Transactional @Query(value = """ select new br.com.stackspot.nullbank.withdrawal.LockableAccount( c ,pg_try_advisory_xact_lock(c.id) ) from Account c where c.id = :accountId and pg_try_advisory_xact_lock(c.id) is not null """ ) public Optional findByIdWithPessimisticAdvisoryLocking(Long accountId); }