PuppetDB和PostgreSQL-不支持事务隔离级别4

问题描述 投票:0回答:2

场景:我以前的配置是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 Transaction isolation level 4 not supported我的JDBC驱动程序很旧。

我已经尝试将它们更新为JBDC 42.2,但是对于远程PostgreSQL 10和本地PostgreSQL 9.4(JDBC 9.1都没有问题),它仍然给出相同的错误。

java postgresql unix jdbc puppet
2个回答
0
投票

java.sql.Connection.TRANSACTION_REPEATABLE_READ是4。

除非我误会,REPEATABLE READ于2004年1月13日在commit 67ee14e879d中引入了支持:

                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驱动程序。


0
投票

再次,我做了一个全新的安装。PuppetDB 2.3.3,PostreSQL10和JDBC 42.2.2,我有事务级别4问题。

© www.soinside.com 2019 - 2024. All rights reserved.