使用 nolock 的 Java Hibernate HQL 查询

发布于 2024-09-14 19:31:10 字数 40 浏览 2 评论 0原文

有没有办法像我向它们添加 (NOLOCK) 提示一样运行这些查询?

Is there a way to run these queries as if I added a (NOLOCK) hint to them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

吝吻 2024-09-21 19:31:10

如果你确实需要这个,那么你想做类似的事情:

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

这与 nolock 相同。

在此之前,请务必仔细考虑是否要进行脏读。大多数时候,人们这样做是因为这是他们一直在做的事情,而不是因为这是正确的事情。特别是,这对于缓存来说效果不佳。

实际上,此线程稍微探讨了这些问题。决定前请仔细阅读。

If you really need this, then you want to do something like:

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

which is identical to a nolock.

Before you do that, really think carefully if you want to do a dirty read. Most of the time people do this because it's what they've always done, rather than because it's the right thing to do. In particular, this does not work well with caching.

Actually, this thread goes into the issues a little. Read carefully before deciding.

淡淡的优雅 2024-09-21 19:31:10

在最新版本的 Hibernate 中,你必须这样做:

  Session session = (Session) em.getDelegate();
        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            }
        });

In latest version of Hibernate you have to do it this way:

  Session session = (Session) em.getDelegate();
        session.doWork(new Work() {
            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            }
        });
金兰素衣 2024-09-21 19:31:10

如果你是原生的,你可以使用“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();

You can do the "with (nolock)" if you go native. This is extreme but if the alternative is changing the transaction isolation level, you might rather do this.

Note that this example is for 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();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文