如何设置查询未被提交?

时间:2010-01-06 20:18:23

标签: java hibernate transactions

使用hibernate,如何将查询设置为未提交读取? 我不希望这是一个全局设置,只是想在每个查询的基础上进行。

5 个答案:

答案 0 :(得分:2)

您是否尝试过session.connection().setTransactionIsolation(...)

P.S。对于基于MVCC的现代DBMS,您不需要使用“read uncomitted”来避免锁定。有些DBMS甚至没有实现这种隔离级别。

答案 1 :(得分:2)

设置事务隔离级别:

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

答案 2 :(得分:2)

Hibernate API本身无法以编程方式执行此操作,我知道这一点。文档确实说您可以将隔离级别指定为配置属性:

  

hibernate.connection.isolation - 设置   JDBC事务隔离级别。   检查java.sql.Connection   有意义的价值

但当然这适用于整个SessionFactory,而不仅仅适用于特定的查询。

很容易摆脱底层的java.sql.Connection隔离级别,但是我会非常小心这样做,你冒着与hibernate自己的锁定策略冲突的风险,这些策略使用了JDBC隔离级别确定将使用哪个LockMode。如果直接在Connection上更改此设置,则可能会得到奇怪的结果。当然,你可能没有选择,但要小心。

“更好”的解决方案是使用Spring's Hibernate Transaction API,它允许您以可预测和可靠的方式完全解除隔离级别与Hibernate API之类的事务语义。

答案 3 :(得分:1)

使用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)

答案 4 :(得分:0)

默认情况下,语句不会在hibernate中提交,直到你明确地执行它(或者连接被返回到池中,并且驱动程序碰巧为你做了提交,这是不能保证的)。所以,它似乎已经做了你想要的。

如果要取消自事务开始以来所做的语句,您也可以回滚当前事务。

在mysql中,您可以执行以下操作:

set session transaction isolation level read uncommitted

或使用方法axtavt suggested

在查询之前调用getTransactionIsolation()以获取当前模式,以便在stmt之后将其放回到stmt之后。