140140import com .google .spanner .executor .v1 .SpannerAsyncActionResponse ;
141141import com .google .spanner .executor .v1 .StartBatchTransactionAction ;
142142import com .google .spanner .executor .v1 .StartTransactionAction ;
143+ import com .google .spanner .executor .v1 .TransactionExecutionOptions ;
143144import com .google .spanner .executor .v1 .UpdateCloudBackupAction ;
144145import com .google .spanner .executor .v1 .UpdateCloudDatabaseDdlAction ;
145146import com .google .spanner .executor .v1 .UpdateCloudInstanceAction ;
@@ -227,13 +228,16 @@ private static class ReadWriteTransaction {
227228 private Mode finishMode ;
228229 private SpannerException error ;
229230 private final String transactionSeed ;
231+ private final boolean optimistic ;
230232 // Set to true when the transaction runner completed, one of these three could happen: runner
231233 // committed, abandoned or threw an error.
232234 private boolean runnerCompleted ;
233235
234- public ReadWriteTransaction (DatabaseClient dbClient , String transactionSeed ) {
236+ public ReadWriteTransaction (
237+ DatabaseClient dbClient , String transactionSeed , boolean optimistic ) {
235238 this .dbClient = dbClient ;
236239 this .transactionSeed = transactionSeed ;
240+ this .optimistic = optimistic ;
237241 this .runnerCompleted = false ;
238242 }
239243
@@ -318,7 +322,10 @@ public void startRWTransaction() throws Exception {
318322 Runnable runnable =
319323 () -> {
320324 try {
321- runner = dbClient .readWriteTransaction ();
325+ runner =
326+ optimistic
327+ ? dbClient .readWriteTransaction (Options .optimisticLock ())
328+ : dbClient .readWriteTransaction ();
322329 LOGGER .log (Level .INFO , String .format ("Ready to run callable %s\n " , transactionSeed ));
323330 runner .run (callable );
324331 transactionSucceeded (runner .getCommitTimestamp ().toProto ());
@@ -537,7 +544,8 @@ public synchronized void startReadOnlyTxn(
537544 }
538545
539546 /** Start a read-write transaction. */
540- public synchronized void startReadWriteTxn (DatabaseClient dbClient , Metadata metadata )
547+ public synchronized void startReadWriteTxn (
548+ DatabaseClient dbClient , Metadata metadata , TransactionExecutionOptions options )
541549 throws Exception {
542550 if ((rwTxn != null ) || (roTxn != null ) || (batchTxn != null )) {
543551 throw SpannerExceptionFactory .newSpannerException (
@@ -548,7 +556,7 @@ public synchronized void startReadWriteTxn(DatabaseClient dbClient, Metadata met
548556 String .format (
549557 "There's no active transaction, safe to create rwTxn: %s\n " , getTransactionSeed ()));
550558 this .metadata = metadata ;
551- rwTxn = new ReadWriteTransaction (dbClient , transactionSeed );
559+ rwTxn = new ReadWriteTransaction (dbClient , transactionSeed , options . getOptimistic () );
552560 LOGGER .log (
553561 Level .INFO ,
554562 String .format (
@@ -2246,7 +2254,7 @@ private Status executeStartTxn(
22462254 Level .INFO ,
22472255 "Starting read-write transaction %s\n " ,
22482256 executionContext .getTransactionSeed ());
2249- executionContext .startReadWriteTxn (dbClient , metadata );
2257+ executionContext .startReadWriteTxn (dbClient , metadata , action . getExecutionOptions () );
22502258 }
22512259 executionContext .setDatabaseClient (dbClient );
22522260 executionContext .initReadState ();
0 commit comments