Mã của bạn là tốt. Tất cả những gì bạn cần nhớ là PESSIMISTIC_WRITE sử dụng SELECT … FOR UPDATE SKIP LOCKED
trong Oracle và PostgreSQL 9.5 . Tôi cho rằng bạn có thể đã quên việc nói với JPA, rằng bạn nên sử dụng phiên bản Postgres mới hơn. Vì vậy, bạn có hai lựa chọn:
- nói với JPA rằng bạn đang sử dụng PostgreSQL Dialect hỗ trợ
SKIP LOCKED
:
Sau đó, tôi nhận được đầu ra mong muốn:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
và rõ ràng, luồng đồng thời không thể tìm nạp các hàng bị khóa cho đến khi hoàn tất giao dịch.where subscripti0_.valid_until<=? and subscripti0_.status='ACTIVE' for update of subscripti0_1_ skip locked
- sử dụng truy vấn gốc:
SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED