首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PuppetDB和PostgreSQL -不支持事务隔离级别4

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

Stack Overflow用户
提问于 2019-10-07 20:17:42
回答 2查看 157关注 0票数 0

场景:我的旧配置是SLES11 PuppetMaster 3.7.5服务器和SLES11 PuppetDB 2.3.3服务器(PostgreSQL 9.4、JDBC9.1和JDK1.7),没有任何问题。

我还安装了一个新的测试SLES12,看看PostgreSQL 10是否能与我们的PuppetDB一起工作。当PuppetDB尝试远程连接/写入时,它会给出错误"transaction isolation level 4 not supported"

根据链接,postgresql Transaction isolation level 4 not supported我的JDBC驱动程序是旧的。

我尝试将它们更新到JBDC42.2,但仍然给出相同的错误,无论是远程PostgreSQL 10还是本地PostgreSQL 9.4 (对于JDBC9.1都没有问题)。

EN

回答 2

Stack Overflow用户

发布于 2019-10-07 21:31:52

java.sql.Connection.TRANSACTION_REPEATABLE_READ是4。

commit 67ee14e879d在2004年1月13日引入了对REPEATABLE READ的支持,除非我弄错了:

代码语言:javascript
复制
                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
EN

Stack Overflow用户

发布于 2019-10-10 22:15:13

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58269396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档