有没有一种方法可以像为这些查询添加(NOLOCK)提示符一样运行它们?
如果你确实需要这样做,那么你想要做的是:
session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
这与无锁(nolock)相同。
在这样做之前,请认真考虑是否要进行脏读取。大多数情况下,人们这样做是因为他们一直这样做,而不是因为这是正确的事情。特别地,这与缓存不兼容。
实际上,这个帖子深入探讨了相关问题。请仔细阅读后再决定。
在最新版本的Hibernate中,您需要按照以下方式执行:
Session session = (Session) em.getDelegate();
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
});
如果您使用本地方式,可以使用“with (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();
@Transactional
注释,则可以将其指定为isolation
属性。 - Tobb