/** Example of using {@link TransactionManager}. */ // [TARGET transactionManager()] // [VARIABLE my_singer_id] public void transactionManager(final long singerId) throws InterruptedException { // [START transactionManager] try (TransactionManager manager = dbClient.transactionManager()) { TransactionContext txn = manager.begin(); while (true) { String column = "FirstName"; Struct row = txn.readRow("Singers", Key.of(singerId), Collections.singleton(column)); String name = row.getString(column); txn.buffer(Mutation.newUpdateBuilder("Singers").set(column).to(name.toUpperCase()).build()); try { manager.commit(); break; } catch (AbortedException e) { Thread.sleep(e.getRetryDelayInMillis() / 1000); txn = manager.resetForRetry(); } } } // [END transactionManager] } }
@Test public void simpleInsert() { TransactionManager manager = client.transactionManager(); TransactionContext txn = manager.begin(); assertThat(manager.getState()).isEqualTo(TransactionState.STARTED); txn.buffer( Mutation.newInsertBuilder("T").set("K").to("Key1").set("BoolValue").to(true).build()); manager.commit(); assertThat(manager.getState()).isEqualTo(TransactionState.COMMITTED); Struct row = client.singleUse().readRow("T", Key.of("Key1"), Arrays.asList("K", "BoolValue")); assertThat(row.getString(0)).isEqualTo("Key1"); assertThat(row.getBoolean(1)).isTrue(); }
@Test public void rollback() { TransactionManager manager = client.transactionManager(); TransactionContext txn = manager.begin(); txn.buffer( Mutation.newInsertBuilder("T").set("K").to("Key2").set("BoolValue").to(true).build()); manager.rollback(); assertThat(manager.getState()).isEqualTo(TransactionState.ROLLED_BACK); // Row should not have been inserted. assertThat(client.singleUse().readRow("T", Key.of("Key2"), Arrays.asList("K", "BoolValue"))) .isNull(); }
Arrays.asList( Mutation.newInsertBuilder("T").set("K").to("Key3").set("BoolValue").to(true).build())); TransactionManager manager1 = client.transactionManager(); TransactionContext txn1 = manager1.begin(); txn1.readRow("T", Key.of("Key3"), Arrays.asList("K", "BoolValue")); TransactionManager manager2 = client.transactionManager(); TransactionContext txn2 = manager2.begin(); txn2.readRow("T", Key.of("Key3"), Arrays.asList("K", "BoolValue"));
@Test public void invalidInsert() { TransactionManager manager = client.transactionManager(); TransactionContext txn = manager.begin(); txn.buffer( Mutation.newInsertBuilder("InvalidTable") .set("K") .to("Key1") .set("BoolValue") .to(true) .build()); try { manager.commit(); fail("Expected exception"); } catch (SpannerException e) { // expected } assertThat(manager.getState()).isEqualTo(TransactionState.COMMIT_FAILED); // We cannot retry for non aborted errors. expectedException.expect(IllegalStateException.class); manager.resetForRetry(); }
@Override protected Object doGetTransaction() throws TransactionException { Tx tx = getCurrentTX(); if (tx != null && tx.transactionManager.getState() == TransactionManager.TransactionState.STARTED) { logger.debug(tx + " reuse; state = " + tx.transactionManager.getState()); return tx; } // create a new one if current is not there tx = new Tx(); tx.transactionManager = this.databaseClient.transactionManager(); logger.debug(tx + " create; state = " + tx.transactionManager.getState()); return tx; }
@Override protected Object doGetTransaction() throws TransactionException { Tx tx = getCurrentTX(); if (tx != null && tx.transactionManager.getState() == TransactionManager.TransactionState.STARTED) { logger.debug(tx + " reuse; state = " + tx.transactionManager.getState()); return tx; } // create a new one if current is not there tx = new Tx(); tx.transactionManager = this.databaseClient.transactionManager(); logger.debug(tx + " create; state = " + tx.transactionManager.getState()); return tx; }