使用hibernate,如何将查询设置为未提交读取? 我不希望这是一个全局设置,只是想在每个查询的基础上进行。
答案 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之后。