PuppetDB и PostgreSQL - уровень изоляции транзакций 4 не поддерживается - PullRequest
0 голосов
/ 07 октября 2019

Сценарий: моей старой конфигурацией был сервер SLES11 PuppetMaster 3.7.5 и сервер SLES11 PuppetDB 2.3.3 (PostgreSQL 9.4, JDBC 9.1 и JDK 1.7), который работает без проблем.

Я также установилновый тест SLES12, чтобы увидеть, работает ли PostgreSQL 10 с нашей PuppetDB. Когда PuppetDB пытается удаленно подключиться / записать, выдает ошибку "transaction isolation level 4 not supported".

По ссылке postgresql Уровень изоляции транзакции 4 не поддерживается мои драйверы JDBC устарели.

Я пытался обновить их до JBDC 42.2, но все равно выдает ту же ошибку, как с удаленным PostgreSQL 10, так и с локальным PostgreSQL 9.4 (у которого нет проблем с JDBC 9.1).

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Еще раз, я сделал чистую новую установку. PuppetDB 2.3.3, PostreSQL10 и JDBC 42.2.2, и у меня есть проблема уровня транзакции 4.

0 голосов
/ 07 октября 2019

java.sql.Connection.TRANSACTION_REPEATABLE_READ равно 4.

Поддержка REPEATABLE READ была введена в commit 67ee14e879d 13 января 2004 года, если я не ошибаюсь:

                else
                {
-                       isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ";
-                       switch (isolationLevel)
-                       {
-                               case Connection.TRANSACTION_READ_COMMITTED:
-                                       isolationLevelSQL += "READ COMMITTED";
-                                       break;
-                               case Connection.TRANSACTION_SERIALIZABLE:
-                                       isolationLevelSQL += "SERIALIZABLE";
-                                       break;
-                               default:
-                                       throw new PSQLException("postgresql.con.isolevel", PSQLState.TRANSACTION_STATE_INVALID,
-                                                                                       new Integer(isolationLevel));
-                       }
+                       isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL " + getIsolationLevelName(level);
                }
                execSQL(isolationLevelSQL);
+               isolationLevel = level;
+       }
+
+       protected String getIsolationLevelName(int level) throws SQLException
+       {
+               boolean pg75 = haveMinimumServerVersion("7.5");
+
+               if (level == Connection.TRANSACTION_READ_COMMITTED) {
+                       return " READ COMMITTED";
+               } else if (level == Connection.TRANSACTION_SERIALIZABLE) {
+                       return " SERIALIZABLE";
+               } else if (pg75 && level == Connection.TRANSACTION_READ_UNCOMMITTED) {
+                       return " READ UNCOMMITTED";
+               } else if (pg75 && level == Connection.TRANSACTION_REPEATABLE_READ) {
+                       return " REPEATABLE READ";
+               }
+               throw new PSQLException("postgresql.con.isolevel", PSQLState.TRANSACTION_STATE_INVALID, new Integer(level));
        }

Поэтому я предполагаю, что вы случайно используете какой-то очень старый драйвер JDBC.

...