Hibernate fornisce la modalità di blocco UPGRADE_SKIPLOCKED.
Utilizzando JPA e Hibernate, per produrre un "SKIP_LOCKED" come da Sospensione LockMode documentazione, devi combinare PESSIMISTIC_WRITE JPA LockModeType :
entityManager.find(Department.class, 1, LockModeType.PESSIMISTIC_WRITE);
e l'impostazione Lock timeout, come ad esempio in persistence.xml per la tua unità di persistenza:
<properties>
<property name="javax.persistence.query.timeout" value="-2"/>
</properties>
(Nota che puoi configurare questo LockMode anche per query complesse)
SKIP LOCKED non fa parte di ANSI SQL. Alcuni RDBMS come i seguenti forniscono questa come caratteristica specifica:
Quindi, con JPA puro, non è possibile specificare un "SKIP LOCKED" nelle query. Infatti, come documentato in LockModeType , JPA 2.1 supporta solo quanto segue:
- NESSUNO
- OTTIMISTA
- OPTIMISTIC_FORCE_INCREMENT
- INCREMENTO_FORZA_PESSIMISTICA
- LETTURA_PESSIMISTICA
- SCRITTURA_PESSIMISTICA
- LEGGI
- SCRIVI
Tuttavia, per abilitare SALTA BLOCCATO nella tua query puoi utilizzare queste alternative:
- Utilizzare funzionalità di implementazione JPA specifiche, come Sospensione LockMode che permette di specificare lo SKIP LOCKED tramite una query JPA, grazie ad una combinazione di PESSIMISTIC_WRITE LockModeType Impostazione specifica del timeout di blocco come descritto sopra
- Crea una query SQL nativa come hai fatto