diff --git a/java-spanner-jdbc/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcConnection.java b/java-spanner-jdbc/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcConnection.java
index 26fcf3cd6503..9d199be5db62 100644
--- a/java-spanner-jdbc/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcConnection.java
+++ b/java-spanner-jdbc/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcConnection.java
@@ -155,12 +155,19 @@ public void setTransactionIsolation(int level) throws SQLException {
@Override
public int getTransactionIsolation() throws SQLException {
checkClosed();
- IsolationLevel isolationLevel = spanner.getDefaultIsolationLevel();
+ IsolationLevel isolationLevel =
+ spanner.isInTransaction()
+ ? spanner.getTransactionIsolationLevel()
+ : spanner.getDefaultIsolationLevel();
if (isolationLevel == IsolationLevel.ISOLATION_LEVEL_UNSPECIFIED) {
return JdbcDatabaseMetaData.getDatabaseDefaultTransactionIsolation(getDatabaseClient());
}
- //noinspection MagicConstant
- return IsolationLevelConverter.convertToJdbc(isolationLevel);
+ try {
+ //noinspection MagicConstant
+ return IsolationLevelConverter.convertToJdbc(isolationLevel);
+ } catch (IllegalArgumentException e) {
+ throw JdbcSqlExceptionFactory.of(e.getMessage(), Code.INVALID_ARGUMENT, e);
+ }
}
@Override
diff --git a/java-spanner-jdbc/src/test/java/com/google/cloud/spanner/jdbc/TransactionMockServerTest.java b/java-spanner-jdbc/src/test/java/com/google/cloud/spanner/jdbc/TransactionMockServerTest.java
index 6aef833c1124..3793b174ba3d 100644
--- a/java-spanner-jdbc/src/test/java/com/google/cloud/spanner/jdbc/TransactionMockServerTest.java
+++ b/java-spanner-jdbc/src/test/java/com/google/cloud/spanner/jdbc/TransactionMockServerTest.java
@@ -130,7 +130,11 @@ public void testUsesManualIsolationLevel() throws SQLException {
.createStatement()
.execute(
"begin transaction isolation level " + isolationLevel.toString().replace("_", " "));
+ assertEquals(
+ IsolationLevelConverter.convertToJdbc(isolationLevel),
+ connection.getTransactionIsolation());
runTestTransaction(connection, isolationLevel);
+ assertEquals(Connection.TRANSACTION_SERIALIZABLE, connection.getTransactionIsolation());
}
}
}
diff --git a/java-spanner/google-cloud-spanner/clirr-ignored-differences.xml b/java-spanner/google-cloud-spanner/clirr-ignored-differences.xml
index 6ae30aeebe3f..454f91f82b08 100644
--- a/java-spanner/google-cloud-spanner/clirr-ignored-differences.xml
+++ b/java-spanner/google-cloud-spanner/clirr-ignored-differences.xml
@@ -1062,6 +1062,11 @@
com/google/cloud/spanner/connection/Connection
java.lang.Object getConnectionPropertyValue(com.google.cloud.spanner.connection.ConnectionProperty)
+
+ 7012
+ com/google/cloud/spanner/connection/Connection
+ com.google.spanner.v1.TransactionOptions$IsolationLevel getTransactionIsolationLevel()
+
7002
diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java
index 60d739a3c850..886b169948bc 100644
--- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java
+++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/Connection.java
@@ -1584,6 +1584,15 @@ default DatabaseClient getDatabaseClient() {
throw new UnsupportedOperationException("Not implemented");
}
+ /**
+ * @return the isolation level of the current transaction. This method may only be called when the
+ * connection is in a transaction.
+ */
+ @InternalApi
+ default IsolationLevel getTransactionIsolationLevel() {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
/** The {@link Spanner} instance that is used by this {@link Connection}. */
@InternalApi
default Spanner getSpanner() {
diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java
index a1ed225c71cc..7cf407fc9fad 100644
--- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java
+++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionImpl.java
@@ -930,7 +930,8 @@ public void setTransactionMode(TransactionMode transactionMode) {
this.unitOfWorkType = UnitOfWorkType.of(transactionMode);
}
- IsolationLevel getTransactionIsolationLevel() {
+ @Override
+ public IsolationLevel getTransactionIsolationLevel() {
ConnectionPreconditions.checkState(!isClosed(), CLOSED_ERROR_MSG);
ConnectionPreconditions.checkState(!isDdlBatchActive(), "This connection is in a DDL batch");
ConnectionPreconditions.checkState(isInTransaction(), "This connection has no transaction");