diff --git a/h2/src/docsrc/html/changelog.html b/h2/src/docsrc/html/changelog.html
index 0a64f6e012..97ed5c8b2a 100644
--- a/h2/src/docsrc/html/changelog.html
+++ b/h2/src/docsrc/html/changelog.html
@@ -21,6 +21,8 @@
Change Log
Next Version (unreleased)
+- Issue #3868: INFORMATION_SCHEMA.SESSIONS.ISOLATION_LEVEL returns isolation level of the current session in all rows
+
- RP #3865: Add possibility to enable virtual worker threads in TCP, Web, and PG servers on Java 21+
- PR #3864: Improve performance of TCP client driver when it is used from virtual threads
diff --git a/h2/src/main/org/h2/table/InformationSchemaTable.java b/h2/src/main/org/h2/table/InformationSchemaTable.java
index 5922798154..a117990f5a 100644
--- a/h2/src/main/org/h2/table/InformationSchemaTable.java
+++ b/h2/src/main/org/h2/table/InformationSchemaTable.java
@@ -2866,7 +2866,7 @@ private void sessions(SessionLocal session, ArrayList
rows, SessionLocal s)
// SESSION_START
s.getSessionStart(),
// ISOLATION_LEVEL
- session.getIsolationLevel().getSQL(),
+ s.getIsolationLevel().getSQL(),
// EXECUTING_STATEMENT
command == null ? null : command.toString(),
// EXECUTING_STATEMENT_START
diff --git a/h2/src/main/org/h2/table/InformationSchemaTableLegacy.java b/h2/src/main/org/h2/table/InformationSchemaTableLegacy.java
index 8e4169ffcb..ac7e821c75 100644
--- a/h2/src/main/org/h2/table/InformationSchemaTableLegacy.java
+++ b/h2/src/main/org/h2/table/InformationSchemaTableLegacy.java
@@ -1891,7 +1891,7 @@ public ArrayList generateRows(SessionLocal session, SearchRow first, Search
// SESSION_START
s.getSessionStart(),
// ISOLATION_LEVEL
- session.getIsolationLevel().getSQL(),
+ s.getIsolationLevel().getSQL(),
// STATEMENT
command == null ? null : command.toString(),
// STATEMENT_START
diff --git a/h2/src/test/org/h2/test/db/TestTransaction.java b/h2/src/test/org/h2/test/db/TestTransaction.java
index 91fcb5549a..26e5244dfc 100644
--- a/h2/src/test/org/h2/test/db/TestTransaction.java
+++ b/h2/src/test/org/h2/test/db/TestTransaction.java
@@ -61,6 +61,7 @@ public void test() throws Exception {
testIsolationLevels4();
testIsolationLevelsCountAggregate();
testIsolationLevelsCountAggregate2();
+ testIsolationLevelsMetadata();
deleteDb("transaction");
}
@@ -1308,4 +1309,56 @@ private void testIsolationLevelCountAggregate2(PreparedStatement prep, long expe
assertEquals(expected, rs.getLong(1));
}
+ private void testIsolationLevelsMetadata() throws SQLException {
+ deleteDb("transaction");
+ try (Connection conn1 = getConnection("transaction"); Connection conn2 = getConnection("transaction")) {
+ PreparedStatement prep1 = conn1.prepareStatement(
+ "SELECT ISOLATION_LEVEL, SESSION_ID = SESSION_ID() FROM INFORMATION_SCHEMA.SESSIONS");
+ PreparedStatement prep2 = conn2.prepareStatement(
+ "SELECT ISOLATION_LEVEL, SESSION_ID = SESSION_ID() FROM INFORMATION_SCHEMA.SESSIONS");
+ for (int isolationLevel : new int[] { Connection.TRANSACTION_READ_UNCOMMITTED,
+ Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ,
+ Constants.TRANSACTION_SNAPSHOT, Connection.TRANSACTION_SERIALIZABLE }) {
+ conn2.setTransactionIsolation(isolationLevel);
+ String level;
+ switch (isolationLevel) {
+ case Connection.TRANSACTION_READ_UNCOMMITTED:
+ level = "READ UNCOMMITTED";
+ break;
+ case Connection.TRANSACTION_READ_COMMITTED:
+ level = "READ COMMITTED";
+ break;
+ case Connection.TRANSACTION_REPEATABLE_READ:
+ level = "REPEATABLE READ";
+ break;
+ case Constants.TRANSACTION_SNAPSHOT:
+ level = "SNAPSHOT";
+ break;
+ case Connection.TRANSACTION_SERIALIZABLE:
+ level = "SERIALIZABLE";
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ ResultSet rs = prep1.executeQuery();
+ while (rs.next()) {
+ if (rs.getBoolean(2)) {
+ assertEquals("READ COMMITTED", rs.getString(1));
+ } else {
+ assertEquals(level, rs.getString(1));
+ }
+ }
+ rs = prep2.executeQuery();
+ while (rs.next()) {
+ if (rs.getBoolean(2)) {
+ assertEquals(level, rs.getString(1));
+ } else {
+ assertEquals("READ COMMITTED", rs.getString(1));
+ }
+ }
+ }
+ }
+ deleteDb("transaction");
+ }
+
}