Skip to content

Commit d82ee63

Browse files
committed
chore: add explanation + test for aborted tx
1 parent 988ccb3 commit d82ee63

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

cloud-spanner-r2dbc/src/main/java/com/google/cloud/spanner/r2dbc/v2/DatabaseClientTransactionManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ ApiFuture<Void> clearTransactionManager() {
109109
ApiFuture<Void> returnFuture = ApiFutures.immediateFuture(null);
110110

111111
if (this.transactionManager != null) {
112+
// We don't close the transaction manager here if it has already been rolled back.
113+
// Rolling back a transaction manager automatically also closes it, and returns the underlying
114+
// session to the pool. Closing it a second time here, would cause it to be added to the pool
115+
// a second time.
112116
if (this.transactionManager.getState() != TransactionState.ROLLED_BACK) {
113117
returnFuture = this.transactionManager.closeAsync();
114118
}

cloud-spanner-r2dbc/src/test/java/com/google/cloud/spanner/r2dbc/v2/MockServerTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import static org.junit.jupiter.api.Assertions.assertEquals;
2121
import static org.junit.jupiter.api.Assertions.assertFalse;
2222
import static org.junit.jupiter.api.Assertions.assertNotNull;
23+
import static org.junit.jupiter.api.Assertions.assertThrows;
2324
import static org.junit.jupiter.api.Assertions.assertTrue;
2425

2526
import com.google.cloud.NoCredentials;
27+
import com.google.cloud.spanner.AbortedException;
2628
import com.google.cloud.spanner.MockSpannerServiceImpl;
2729
import com.google.cloud.spanner.MockSpannerServiceImpl.StatementResult;
2830
import com.google.cloud.spanner.Statement;
@@ -242,6 +244,29 @@ public void testRollbackTransaction() {
242244
assertEquals(0, mockSpanner.countRequestsOfType(CommitRequest.class));
243245
}
244246

247+
@Test
248+
public void testAbortedTransaction() {
249+
String sql = "insert into foo (id) values (1)";
250+
mockSpanner.putStatementResult(StatementResult.update(Statement.of(sql), 1L));
251+
252+
ConnectionFactory connectionFactory = createConnectionFactory();
253+
Publisher<? extends Connection> connectionPublisher = connectionFactory.create();
254+
Connection connection = Mono.from(connectionPublisher).block();
255+
256+
mockSpanner.abortNextTransaction();
257+
assertThrows(AbortedException.class, () -> Flux.concat(
258+
connection.beginTransaction(),
259+
connection.createStatement(sql).execute(),
260+
connection.commitTransaction()
261+
).blockLast());
262+
263+
Mono.from(((Closeable) connectionFactory).close()).subscribe();
264+
265+
assertEquals(1, mockSpanner.countRequestsOfType(ExecuteSqlRequest.class));
266+
assertEquals(0, mockSpanner.countRequestsOfType(RollbackRequest.class));
267+
assertEquals(1, mockSpanner.countRequestsOfType(CommitRequest.class));
268+
}
269+
245270
@Test
246271
public void testRollbackEmptyTransactionAndExecuteSqlInParallel() throws Exception {
247272
// Redirect log to /dev/null.

0 commit comments

Comments
 (0)