Как установить запрос для чтения без передачи? - PullRequest
4 голосов
/ 06 января 2010

в спящем режиме, как я могу установить запрос для чтения незафиксированным? Я не хочу, чтобы это был глобальный параметр, просто хочу сделать это для каждого запроса.

Ответы [ 5 ]

2 голосов
/ 06 января 2010

Сам Hibernate API не предоставляет никакого способа сделать это программно, о чем я знаю. В документах сказано, что вы можете указать уровень изоляции в качестве свойства конфигурации:

hibernate.connection.isolation - Наборы уровень изоляции транзакции JDBC. Проверьте java.sql.Connection для значимые значения

Но, конечно, это относится ко всему SessionFactory, а не только к конкретным запросам.

Соблазнительно поиграть с базовым уровнем изоляции java.sql.Connection, но я буду очень осторожен с такими вещами: вы рискуете вступить в конфликт с собственными стратегиями блокировки hibernate, которые используют уровень изоляции JDBC для определения который LockMode будет использоваться. Если вы измените это непосредственно в Соединении, вы можете получить странные результаты. Конечно, у вас может не быть выбора, но будьте осторожны.

«Лучшим» решением было бы использование API транзакции Hibernate Spring , который позволяет полностью и предсказуемо и надежно отделить семантику транзакции, например уровень изоляции, от API Hibernate.

2 голосов
/ 06 января 2010

Вы пробовали session.connection().setTransactionIsolation(...)?

P.S. Для современных СУБД на базе MVCC вам не нужно использовать «read uncommitted», чтобы избежать блокировок. В некоторых СУБД этот уровень изоляции даже не реализован.

2 голосов
/ 06 января 2010

Установить уровень изоляции транзакции:

session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
1 голос
/ 28 июля 2013

Используя Spring с Hibernate, можно иметь Spring, управляющий транзакциями с аннотациями, что является некоторой конфигурацией, подобной приведенной ниже в spring applicationContext.xml:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- To use annotation driven in aspect mode (mode="aspectj"), it is necessary to add spring-aspects lib -->
<tx:annotation-driven transaction-manager="transactionManager" />

Лучший способ добиться этого - использовать аннотацию, подобную приведенной ниже:

@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_UNCOMMITTED)
0 голосов
/ 06 января 2010

по умолчанию операторы не фиксируются в спящем режиме до тех пор, пока вы не сделаете это явно (или соединение не будет возвращено в пул, а драйвер выполнит за вас фиксацию, что не гарантируется). похоже, он уже делает то, что вы хотите.

Вы также можете просто откатить текущую транзакцию, если хотите аннулировать утверждения, сделанные с начала транзакции.

в MySQL вы можете сделать что-то вроде:

set session transaction isolation level read uncommitted

или используйте предложенный метод axtavt ,

вызов getTransactionIsolation () перед запросом, чтобы получить текущий режим, чтобы вы могли вернуть его после stmt, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...