MultiUseReadOnlyTransaction( SessionImpl session, TimestampBound bound, SpannerRpc rpc, int defaultPrefetchChunks) { super(session, rpc, defaultPrefetchChunks); checkArgument( bound.getMode() != TimestampBound.Mode.MAX_STALENESS && bound.getMode() != TimestampBound.Mode.MIN_READ_TIMESTAMP, "Bounded staleness mode %s is not supported for multi-use read-only transactions." + " Create a single-use read or read-only transaction instead.", bound.getMode()); this.bound = bound; }
@Override @Nullable TransactionSelector getTransactionSelector() { if (bound.getMode() == TimestampBound.Mode.STRONG) { // Default mode: no need to specify a transaction. return null; } return TransactionSelector.newBuilder() .setSingleUse(TransactionOptions.newBuilder().setReadOnly(bound.toProto())) .build(); } }
@Test public void strong() { TimestampBound bound = TimestampBound.strong(); assertThat(bound.getMode()).isEqualTo(Mode.STRONG); assertThat(bound.toString()).isEqualTo("strong"); assertProto(bound, "strong: true"); }
@Test public void minReadTimestamp() { Timestamp ts = Timestamp.ofTimeSecondsAndNanos(TEST_TIME_SECONDS, 0); TimestampBound bound = TimestampBound.ofMinReadTimestamp(ts); assertThat(bound.getMode()).isEqualTo(Mode.MIN_READ_TIMESTAMP); assertThat(bound.getMinReadTimestamp()).isEqualTo(ts); assertThat(bound.toString()).isEqualTo("min_read_timestamp: " + TEST_TIME_ISO); assertProto(bound, "min_read_timestamp { seconds: " + TEST_TIME_SECONDS + " }"); }
@Test public void readTimestamp() { Timestamp ts = Timestamp.ofTimeSecondsAndNanos(TEST_TIME_SECONDS, 0); TimestampBound bound = TimestampBound.ofReadTimestamp(ts); assertThat(bound.getMode()).isEqualTo(Mode.READ_TIMESTAMP); assertThat(bound.getReadTimestamp()).isEqualTo(ts); assertThat(bound.toString()).isEqualTo("exact_timestamp: " + TEST_TIME_ISO); assertProto(bound, "read_timestamp { seconds: " + TEST_TIME_SECONDS + " }"); }
@Test public void maxStaleness() { TimestampBound bound = TimestampBound.ofMaxStaleness(3140, TimeUnit.MILLISECONDS); assertThat(bound.getMode()).isEqualTo(Mode.MAX_STALENESS); assertThat(bound.getMaxStaleness(TimeUnit.SECONDS)).isEqualTo(3); assertThat(bound.getMaxStaleness(TimeUnit.MILLISECONDS)).isEqualTo(3140); assertThat(bound.getMaxStaleness(TimeUnit.MICROSECONDS)).isEqualTo(3140000); assertThat(bound.getMaxStaleness(TimeUnit.NANOSECONDS)).isEqualTo(3140000000L); assertThat(bound.toString()).isEqualTo("max_staleness: 3.140s"); assertProto(bound, "max_staleness { seconds: 3 nanos: 140000000 }"); }
@Test public void exactStaleness() { TimestampBound bound = TimestampBound.ofExactStaleness(3140, TimeUnit.MILLISECONDS); assertThat(bound.getMode()).isEqualTo(Mode.EXACT_STALENESS); assertThat(bound.getExactStaleness(TimeUnit.SECONDS)).isEqualTo(3); assertThat(bound.getExactStaleness(TimeUnit.MILLISECONDS)).isEqualTo(3140); assertThat(bound.getExactStaleness(TimeUnit.MICROSECONDS)).isEqualTo(3140000); assertThat(bound.getExactStaleness(TimeUnit.NANOSECONDS)).isEqualTo(3140000000L); assertThat(bound.toString()).isEqualTo("exact_staleness: 3.140s"); assertProto(bound, "exact_staleness { seconds: 3 nanos: 140000000 }"); }
MultiUseReadOnlyTransaction( SessionImpl session, TimestampBound bound, SpannerRpc rpc, int defaultPrefetchChunks) { super(session, rpc, defaultPrefetchChunks); checkArgument( bound.getMode() != TimestampBound.Mode.MAX_STALENESS && bound.getMode() != TimestampBound.Mode.MIN_READ_TIMESTAMP, "Bounded staleness mode %s is not supported for multi-use read-only transactions." + " Create a single-use read or read-only transaction instead.", bound.getMode()); this.bound = bound; }
@Override @Nullable TransactionSelector getTransactionSelector() { if (bound.getMode() == TimestampBound.Mode.STRONG) { // Default mode: no need to specify a transaction. return null; } return TransactionSelector.newBuilder() .setSingleUse(TransactionOptions.newBuilder().setReadOnly(bound.toProto())) .build(); } }