【发布时间】:2018-12-12 12:33:30
【问题描述】:
是否可以在不创建事务的情况下在 Datanucleus 中读取查询? 我想在我的应用程序中进行非阻塞脏读,但即使没有创建事务,我也会在 postgre 日志中看到它。将属性“datanucleus.NontransactionalRead”设置为 true 没有帮助。
entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createNativeQuery("select * from managers where department_id='1' and account_id = '1'", User.class);
entityManager.close();
这是postgresql-9.5-main.log的一部分
2018-12-13 14:43:42 user@test LOG: execute <unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2018-12-13 14:43:42 user@test LOG: execute <unnamed>: BEGIN 2018-12-13 14:43:42 user@test LOG: execute <unnamed>: select * from managers where department_id='9' and account_id = '9'
2018-12-13 14:43:42 user@test LOG: execute S_2: COMMIT
也许这只是一个误解,或者我没有正确地提出我的问题。
我已经深入研究了 postgresql 驱动程序库,我发现在几次 DataNucleus 调用之后,控制权转到 HikariProxyPreparedStatement,然后转到 PostgresqlExecutorImpl。有一个 QueryExecutorImpl.sendQueryPreamble() 调用,它使用 beginTransactionQuery 作为参数调用 sendOneQuery()。所以 beginTransactionQuery 它是一个只有“BEGIN” sql 字符串的 SimpleQuery。我假设这是一个交易开始。
我说的对吗?如果是这样,如何避免创建交易?如果不是请纠正我。
【问题讨论】:
-
NonTransactionRead DEFAULTS 为 TRUE,这只是表示允许没有 JDO 事务的操作。您还没有说在没有 JDO 事务的情况下执行操作(并发布代码)时会发生什么!
-
@BillyFrost 感谢您的回复。这是我在这里的第一个问题,我无法编辑它。
entityManager = entityManagerFactory.createEntityManager(); Query query = entityManager.createNativeQuery("select * from managers where department_id='1' and account_id = '1'", User.class); entityManager.close(); -
任何 PostgreSQL 日志中都没有显示“事务”......这是一个 JDBC/SQL 连接正在分发和关闭。事务由 JDO/JPA 提供者管理,它将管理正在使用的任何连接。 DataNucleus 日志告诉你它在做什么
-
我已启用 DataNucleus 日志。你是对的,没有关于开放交易的消息。但我在 postgresql-9.5-main.log
2018-12-13 14:43:42 user@test LOG: execute <unnamed>: SHOW TRANSACTION ISOLATION LEVEL 2018-12-13 14:43:42 user@test LOG: execute <unnamed>: BEGIN 2018-12-13 14:43:42 user@test LOG: execute <unnamed>: select * from managers where department_id='9' and account_id = '9' 2018-12-13 14:43:42 user@test LOG: execute S_2: COMMIT中看到了 -
这是一个连接被分配,然后被提交。
EntityManager通常会使用单个连接,因此您在打开它时得到一个,并在关闭时释放它。
标签: java database postgresql configuration datanucleus