Предотвращение транзакций DataNucleus при каждом чтении - PullRequest
0 голосов
/ 12 декабря 2018

Возможно ли иметь запросы на чтение в 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 (), который вызывает sendOneQuery () с beginTransactionQuery в качестве параметра.Так что beginTransactionQuery - это SimpleQuery с только что "BEGIN" строкой sql.Я предполагаю, что это открытие транзакции.

Я прав?Если так, как избежать создания транзакции?Если нет, поправьте меня.

1 Ответ

0 голосов
/ 18 декабря 2018

Я думаю, что нашел, в чем дело.

DataNucleus выполняет все запросы в транзакциях, кроме запросов, имеющих TransactionIsolation.NONE, даже если транзакция не создана.Любое соединение для запроса без транзакций будет переключено на autocommit true и, в основном, для всех остальных уровней, оно будет переключено на false.Любой истинный запрос autocmmit приводит к отправке запроса BEGIN, который запускает транзакцию.

Таким образом, похоже, что невозможно выполнять чтение из PostgreSQL без выполнения транзакций, которые будут созданы в любом случае, потому что PostgreSQL не поддерживает TransactionIsolation.NONE.Вы можете понять это, если взгляните на код ConnectionFactoryImpl

Было бы неплохо, если бы кто-то из разработчиков DataNucleus разъяснил это.

...