繁体   English   中英

防止每次读取都进行DataNucleus事务

[英]Prevent DataNucleus transactions on every read

是否可以在不创建事务的情况下在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。 我认为这是一个交易开始。

我对吗? 如果是这样,如何避免创建交易? 如果没有,请纠正我。

我想我已经找到了情况。

DataNucleus将运行事务中的所有查询,但不包含TransactionIsolation.NONE的查询除外,即使未创建事务也是如此。 非事务查询的任何连接都将切换为自动提交true,大多数其他级别的连接都将切换为false。 任何一种autocmmit true查询都会导致发送BEGIN查询,从而启动事务。

因此,看起来好像不进行事务处理就不可能从PostgreSQL读取数据,因为在任何情况下都不会创建事务,因为PostgreSQL不支持TransactionIsolation.NONE。 如果看一下ConnectionFactoryImpl的代码,就可以弄清楚

如果来自DataNucleus开发人员的人澄清这一点,那将是很好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM