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");