java - 防止每次读取时发生 DataNucleus 事务

标签 java database postgresql configuration datanucleus

是否可以在不创建事务的情况下在 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 开发人员能澄清这一点,那就太好了。

关于java - 防止每次读取时发生 DataNucleus 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743128/

相关文章:

c# - 存储过程返回错误的小数点

php - 将数据库翻译成不同的语言

sql - 从聚集复合键移动到顺序整数聚集键时性能下降

java - 无法在其他计算机上运行 Jar 文件。错误 : no file in java. 库.path

java - 给定一个堆栈,其中包含多个类的对象,如何管理弹出的对象?

mysql - Serializable 隔离级别是否保护数据库免受 ACIDRain 攻击?

python - 像在spss中一样在sql中制作数据透视表

postgresql - 在同一行 Postgres 中使用来自 jSON 的值更新新列

java - 避免缓存失败的操作

android - SQLite 数据库查询非常慢(SQLite Asset Helper)