package org.hibernate.test.locking; import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.Session; import org.hibernate.boot.SessionFactoryBuilder; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.dialect.PostgreSQL81Dialect; import org.hibernate.dialect.PostgreSQL95Dialect; import org.hibernate.dialect.SQLServer2005Dialect; import org.hibernate.testing.RequiresDialect; import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; import org.hibernate.test.util.jdbc.SQLStatementInterceptor; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertTrue; /** * @author Vlad Mihalcea */ public class PessimisticWriteLockTimeoutTest extends BaseNonConfigCoreFunctionalTestCase { private SQLStatementInterceptor sqlStatementInterceptor; @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] { A.class }; } @Override protected void configureSessionFactoryBuilder(SessionFactoryBuilder sfb) { sqlStatementInterceptor = new SQLStatementInterceptor( sfb ); } private A entity; @Before public void createTestData() { Session session = sessionFactory().openSession(); session.beginTransaction(); try { entity = new A(); session.persist( entity ); } finally { session.getTransaction().commit(); session.close(); } } @Test @RequiresDialect({ Oracle8iDialect.class, PostgreSQL81Dialect.class, SQLServer2005Dialect.class } ) public void testNoWait() throws NoSuchFieldException, IllegalAccessException { Session session = sessionFactory().openSession(); session.beginTransaction(); try { session.createQuery( "select a from A a", A.class ) .unwrap( org.hibernate.query.Query.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.NO_WAIT ) ) .list(); String lockingQuery = sqlStatementInterceptor.getSqlQueries().getLast(); assertTrue( lockingQuery.toLowerCase().contains( "nowait") ); } finally { session.getTransaction().commit(); session.close(); } } @Test @RequiresDialect({ Oracle8iDialect.class, PostgreSQL95Dialect.class }) public void testSkipLocked() throws NoSuchFieldException, IllegalAccessException { Session session = sessionFactory().openSession(); session.beginTransaction(); try { session.createQuery( "select a from A a", A.class ) .unwrap( org.hibernate.query.Query.class ) .setLockOptions( new LockOptions( LockMode.PESSIMISTIC_WRITE ) .setTimeOut( LockOptions.SKIP_LOCKED ) ) .list(); String lockingQuery = sqlStatementInterceptor.getSqlQueries().getLast(); assertTrue( lockingQuery.toLowerCase().contains( "skip locked") ); } finally { session.getTransaction().commit(); session.close(); } } }