с в спящем режиме, как я могу установить запрос, который будет считан незафиксированный? Я не хочу, чтобы это было глобальной установкой, просто хотело сделать это на на основание запроса.
Вы пробовали session.connection().setTransactionIsolation(...)
?
P.S. Для современной СУБД на базе MVCC нет необходимости использовать "чтение без фиксации", чтобы избежать блокировок. В некоторых СУБД такой уровень изоляции даже не реализован.
Установите уровень изоляции транзакций:
session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
Сам Hibernate API не предоставляет возможности сделать это программно, о чем я знаю. В документах сказано, что вы можете указать уровень изоляции в качестве свойства конфигурации:
hibernate.connection.isolation - Setts уровень изоляции транзакций JDBC. Проверьте java.sql.Connection для смысловые значения
Но, конечно, это относится ко всей SessionFactory
, а не только к конкретным запросам.
Соблазнительно обманывать базовый уровень изоляции java.sql.Connection
, но я был бы очень осторожен в таких вещах, вы рискуете вступить в конфликт с собственными стратегиями блокировки hibernate, которые используют уровень изоляции JDBC, чтобы определить, какой уровень изоляции LockMode
будет использоваться. Если вы измените это непосредственно на Connection, вы можете получить странные результаты. Конечно, у вас может не быть выбора, но будьте осторожны.
"Лучшим" решением будет использование Spring's Hibernate Transaction API, которое позволяет вам полностью, предсказуемым и надежным образом развязать семантику транзакций, такую как уровень изоляции от Hibernate API.
по умолчанию, выражения не фиксируются в спящем режиме до тех пор, пока вы не сделаете это явно (или соединение будет возвращено в пул и драйвер случайно не сделает фиксацию за вас, что не гарантируется). так что, похоже, он уже делает то, что вы хотите.
вы также можете просто откатить текущую транзакцию, если хотите аннулировать утверждения, сделанные с начала транзакции.
в mysql, вы можете сделать что-то вроде:
set session transaction isolation level read uncommitted
или использовать метод axtavt proposed,
call getTransactionIsolation() перед запросом, чтобы получить текущий режим, так что вы можете поставить его обратно после stmt, если захотите.