Java Hibernate HQL запросы с nolock

Есть ли способ запустить эти запросы, как если бы я добавил к ним подсказку (NOLOCK)?

Ответ 1

Если вам это действительно нужно, вы хотите сделать что-то вроде:

session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

который идентичен нолоку.

Прежде чем вы это сделаете, действительно тщательно подумайте, хотите ли вы сделать грязное чтение. Большую часть времени люди делают это, потому что это то, что они всегда делали, а не потому, что это правильно. В частности, это не очень хорошо работает с кэшированием.

Собственно, этот поток немного разбирается в проблемах. Прочитайте внимательно, прежде чем принимать решение.

Ответ 2

В последней версии Hibernate вы должны сделать это следующим образом:

  Session session = (Session) em.getDelegate();
        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            }
        });

Ответ 3

Вы можете сделать "с (nolock)", если вы идете на родной язык. Это крайне важно, но если альтернатива меняет уровень изоляции транзакций, вы можете это сделать.

Обратите внимание, что этот пример для MSSQL.

String sqlQueryString = "SELECT * FROM my_classes_table WITH (nolock) WHERE columnName = :columnValue";

SQLQuery sqlQuery= session.createSQLQuery(sqlQueryString).addEntity(MyClass.class);
sqlQuery.setLong("columnValue", value);
List<MyClass> out = sqlQuery.list();