diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java index bb5140c4755..502ec9d54f8 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManager.java @@ -203,7 +203,10 @@ interface AsyncTransactionFunction { /** Returns the state of the transaction. */ TransactionState getState(); - /** Returns the {@link CommitResponse} of this transaction. */ + /** + * Returns the {@link CommitResponse} of this transaction. This method may only be called after + * committing the transaction. + */ ApiFuture getCommitResponse(); /** diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java index ebba9fa9e17..14089afb82a 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/AsyncTransactionManagerImpl.java @@ -221,6 +221,9 @@ public TransactionState getState() { @Override public ApiFuture getCommitResponse() { + Preconditions.checkState( + txnState == TransactionState.COMMITTED, + "getCommitResponse can only be invoked if the transaction was successfully committed"); return commitResponse; } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java index 68cf63d872f..59657026e57 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/AsyncTransactionManagerTest.java @@ -200,6 +200,14 @@ public void asyncTransactionManager_shouldRollbackOnCloseAsync() throws Exceptio 0L); } + @Test + public void testAsyncTransactionManager_getCommitResponseReturnsErrorBeforeCommit() { + try (AsyncTransactionManager manager = client().transactionManagerAsync()) { + TransactionContextFuture transactionContextFuture = manager.beginAsync(); + assertThrows(IllegalStateException.class, manager::getCommitResponse); + } + } + @Test public void testAsyncTransactionManager_returnsCommitStats() throws Exception { try (AsyncTransactionManager manager =