【问题标题】:PuppetDB and PostgreSQL - Transaction isolation level 4 not supportedPuppetDB 和 PostgreSQL - 不支持事务隔离级别 4
【发布时间】:2019-10-07 12:17:42
【问题描述】:

场景: 我的旧配置是 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 都没有问题)。

【问题讨论】:

  • 请提供异常的完整堆栈跟踪。如果您的应用程序确保路径上没有旧版本的驱动程序,我建议您仔细检查类路径。
  • "2019-09-05 12:34:42,679 ERROR [c.p.p.command] [54390b551-8549a-4455-erbb-cer8ere19a25] [replace catalog] Retrying after attempt 4, due to: org.postgresql.util.PSQLException: Transaction isolation level 4 not supported." 我的“应用程序”是 PuppetDB。不知道如何以及在哪里轻松检查它
  • 看起来异常是由 JDBC 驱动程序抛出的,尽管堆栈跟踪会更清楚。我倾向于相信您执行的任何更新都不会影响 PuppetDB 正在使用的驱动程序副本。
  • 更准确地说。我尝试使用 JDBC 9.4 实际更新旧机器上的驱动程序,以及在新的空白 SLES12 上从头开始安装 PuppetDB、PostgreSQL10 和 JDBC42.2 的所有内容。因此,我高度怀疑“老司机”是否是问题所在。其他东西的组合会引发这个错误吗?我不知道如何编辑 PuppetDB.jar 或 JDBC 以添加任何调试。

标签: java postgresql unix jdbc puppet


【解决方案1】:

java.sql.Connection.TRANSACTION_REPEATABLE_READ 是 4。

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

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

【讨论】:

  • 正如我在帖子中明确写的那样,我已经读过这可能是原因,因此我使用的是最新的 JDBC 驱动程序,并且是唯一安装在服务器上的驱动程序。
  • 是的,谢谢。我有一个只有 JDBC 42.2 的全新安装,因此我想知道它还能是什么。现在驱动程序只在本地安装了 PostgreSQL 的 PuppetDB 上,不在 puppet master 或代理节点上
【解决方案2】:

我再次进行了全新的安装。 PuppetDB 2.3.3、PostreSQL10 和 JDBC 42.2.2,我遇到了事务级别 4 问题。

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 2019-11-14
    • 1970-01-01
    • 2012-03-19
    • 2011-09-30
    • 1970-01-01
    • 2015-03-26
    • 2011-02-24
    • 2015-07-21
    相关资源
    最近更新 更多