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..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 @@ -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,12 @@ 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())); + } } clear(); }