From d411423ff3f998b7df756fbffc8c45606b5bb7e3 Mon Sep 17 00:00:00 2001 From: gyang-google <48337601+gyang-google@users.noreply.github.com> Date: Wed, 8 Jul 2026 03:32:41 -0700 Subject: [PATCH 1/2] Refactor SI options in CloudClientExecutor Refactor SI options handling to include read lock mode and isolation level based on conditions. --- .../executor/spanner/CloudClientExecutor.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java b/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java index 1a2e55c1b433..0818858e818c 100644 --- a/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java +++ b/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java @@ -394,15 +394,14 @@ public void startRWTransaction() throws Exception { List transactionOptions = new ArrayList<>(); if (repeatableRead) { transactionOptions.add(Options.isolationLevel(IsolationLevel.REPEATABLE_READ)); - } else { - transactionOptions.add(Options.isolationLevel(IsolationLevel.SERIALIZABLE)); + transactionOptions.add( + Options.readLockMode( + optimistic ? ReadLockMode.OPTIMISTIC : ReadLockMode.PESSIMISTIC)); } if (!repeatableRead && optimistic) { + transactionOptions.add(Options.isolationLevel(IsolationLevel.SERIALIZABLE)); transactionOptions.add(Options.readLockMode(ReadLockMode.OPTIMISTIC)); } - if (repeatableRead && !optimistic) { - transactionOptions.add(Options.readLockMode(ReadLockMode.PESSIMISTIC)); - } runner = dbClient.readWriteTransaction( transactionOptions.toArray( @@ -775,11 +774,22 @@ public synchronized Status finish(Mode finishMode, OutcomeSender sender) { if (rwTxn.getTimestamp() != null) { outcomeBuilder.setCommitTime(rwTxn.getTimestamp()); } - if (finishMode == Mode.COMMIT - && rwTxn.runner.getCommitResponse().getSnapshotTimestamp() != null) { - outcomeBuilder.setSnapshotIsolationTxnReadTimestamp( - Timestamps.toMicros( - rwTxn.runner.getCommitResponse().getSnapshotTimestamp().toProto())); + if (finishMode == Mode.COMMIT && rwTxn.runner.getCommitResponse() != null) { + com.google.cloud.spanner.CommitResponse commitResponse = rwTxn.runner.getCommitResponse(); + if (commitResponse.getSnapshotTimestamp() != null) { + outcomeBuilder.setSnapshotIsolationTxnReadTimestamp( + Timestamps.toMicros(commitResponse.getSnapshotTimestamp().toProto())); + } + if (commitResponse.getReadLockMode() != null) { + outcomeBuilder.setReadLockMode( + com.google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode.forNumber( + commitResponse.getReadLockMode().getNumber())); + } + if (commitResponse.getIsolationLevel() != null) { + outcomeBuilder.setIsolationLevel( + com.google.spanner.v1.TransactionOptions.IsolationLevel.forNumber( + commitResponse.getIsolationLevel().getNumber())); + } } clear(); } From e0e9ebf6b875f1d9aa6df566e5fe6f888fbc8952 Mon Sep 17 00:00:00 2001 From: gyang-google <48337601+gyang-google@users.noreply.github.com> Date: Wed, 8 Jul 2026 16:07:11 -0700 Subject: [PATCH 2/2] Remove read lock mode and isolation level handling Removed handling of read lock mode and isolation level from commit response. --- .../cloud/executor/spanner/CloudClientExecutor.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java b/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java index 0818858e818c..ae57680df255 100644 --- a/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java +++ b/java-spanner/google-cloud-spanner-executor/src/main/java/com/google/cloud/executor/spanner/CloudClientExecutor.java @@ -780,16 +780,6 @@ public synchronized Status finish(Mode finishMode, OutcomeSender sender) { outcomeBuilder.setSnapshotIsolationTxnReadTimestamp( Timestamps.toMicros(commitResponse.getSnapshotTimestamp().toProto())); } - if (commitResponse.getReadLockMode() != null) { - outcomeBuilder.setReadLockMode( - com.google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode.forNumber( - commitResponse.getReadLockMode().getNumber())); - } - if (commitResponse.getIsolationLevel() != null) { - outcomeBuilder.setIsolationLevel( - com.google.spanner.v1.TransactionOptions.IsolationLevel.forNumber( - commitResponse.getIsolationLevel().getNumber())); - } } clear(); }