|
66 | 66 | import com.google.spanner.v1.ExecuteSqlRequest;
|
67 | 67 | import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions;
|
68 | 68 | import com.google.spanner.v1.SpannerGrpc;
|
| 69 | +import com.google.spanner.v1.TransactionOptions; |
| 70 | +import com.google.spanner.v1.TransactionOptions.IsolationLevel; |
69 | 71 | import io.grpc.CallCredentials;
|
70 | 72 | import io.grpc.CompressorRegistry;
|
71 | 73 | import io.grpc.Context;
|
@@ -178,6 +180,7 @@ public class SpannerOptions extends ServiceOptions<Spanner, SpannerOptions> {
|
178 | 180 | private final boolean enableExtendedTracing;
|
179 | 181 | private final boolean enableEndToEndTracing;
|
180 | 182 | private final String monitoringHost;
|
| 183 | + private final TransactionOptions defaultTransactionOptions; |
181 | 184 |
|
182 | 185 | enum TracingFramework {
|
183 | 186 | OPEN_CENSUS,
|
@@ -807,6 +810,7 @@ protected SpannerOptions(Builder builder) {
|
807 | 810 | enableBuiltInMetrics = builder.enableBuiltInMetrics;
|
808 | 811 | enableEndToEndTracing = builder.enableEndToEndTracing;
|
809 | 812 | monitoringHost = builder.monitoringHost;
|
| 813 | + defaultTransactionOptions = builder.defaultTransactionOptions; |
810 | 814 | }
|
811 | 815 |
|
812 | 816 | /**
|
@@ -988,6 +992,7 @@ public static class Builder
|
988 | 992 | private String monitoringHost = SpannerOptions.environment.getMonitoringHost();
|
989 | 993 | private SslContext mTLSContext = null;
|
990 | 994 | private boolean isExperimentalHost = false;
|
| 995 | + private TransactionOptions defaultTransactionOptions = TransactionOptions.getDefaultInstance(); |
991 | 996 |
|
992 | 997 | private static String createCustomClientLibToken(String token) {
|
993 | 998 | return token + " " + ServiceOptions.getGoogApiClientLibName();
|
@@ -1056,6 +1061,7 @@ protected Builder() {
|
1056 | 1061 | this.enableBuiltInMetrics = options.enableBuiltInMetrics;
|
1057 | 1062 | this.enableEndToEndTracing = options.enableEndToEndTracing;
|
1058 | 1063 | this.monitoringHost = options.monitoringHost;
|
| 1064 | + this.defaultTransactionOptions = options.defaultTransactionOptions; |
1059 | 1065 | }
|
1060 | 1066 |
|
1061 | 1067 | @Override
|
@@ -1645,6 +1651,55 @@ public Builder setEnableEndToEndTracing(boolean enableEndToEndTracing) {
|
1645 | 1651 | return this;
|
1646 | 1652 | }
|
1647 | 1653 |
|
| 1654 | + /** |
| 1655 | + * Provides the default read-write transaction options for all databases. These defaults are |
| 1656 | + * overridden by any explicit {@link com.google.cloud.spanner.Options.TransactionOption} |
| 1657 | + * provided through {@link DatabaseClient}. |
| 1658 | + * |
| 1659 | + * <p>Example Usage: |
| 1660 | + * |
| 1661 | + * <pre>{@code |
| 1662 | + * DefaultReadWriteTransactionOptions options = DefaultReadWriteTransactionOptions.newBuilder() |
| 1663 | + * .setIsolationLevel(IsolationLevel.SERIALIZABLE) |
| 1664 | + * .build(); |
| 1665 | + * }</pre> |
| 1666 | + */ |
| 1667 | + public static class DefaultReadWriteTransactionOptions { |
| 1668 | + private final TransactionOptions defaultTransactionOptions; |
| 1669 | + |
| 1670 | + private DefaultReadWriteTransactionOptions(TransactionOptions defaultTransactionOptions) { |
| 1671 | + this.defaultTransactionOptions = defaultTransactionOptions; |
| 1672 | + } |
| 1673 | + |
| 1674 | + public static DefaultReadWriteTransactionOptionsBuilder newBuilder() { |
| 1675 | + return new DefaultReadWriteTransactionOptionsBuilder(); |
| 1676 | + } |
| 1677 | + |
| 1678 | + public static class DefaultReadWriteTransactionOptionsBuilder { |
| 1679 | + private final TransactionOptions.Builder transactionOptionsBuilder = |
| 1680 | + TransactionOptions.newBuilder(); |
| 1681 | + |
| 1682 | + public DefaultReadWriteTransactionOptionsBuilder setIsolationLevel( |
| 1683 | + IsolationLevel isolationLevel) { |
| 1684 | + transactionOptionsBuilder.setIsolationLevel(isolationLevel); |
| 1685 | + return this; |
| 1686 | + } |
| 1687 | + |
| 1688 | + public DefaultReadWriteTransactionOptions build() { |
| 1689 | + return new DefaultReadWriteTransactionOptions(transactionOptionsBuilder.build()); |
| 1690 | + } |
| 1691 | + } |
| 1692 | + } |
| 1693 | + |
| 1694 | + /** Sets the {@link DefaultReadWriteTransactionOptions} for read-write transactions. */ |
| 1695 | + public Builder setDefaultTransactionOptions( |
| 1696 | + DefaultReadWriteTransactionOptions defaultReadWriteTransactionOptions) { |
| 1697 | + Preconditions.checkNotNull( |
| 1698 | + defaultReadWriteTransactionOptions, "DefaultReadWriteTransactionOptions cannot be null"); |
| 1699 | + this.defaultTransactionOptions = defaultReadWriteTransactionOptions.defaultTransactionOptions; |
| 1700 | + return this; |
| 1701 | + } |
| 1702 | + |
1648 | 1703 | @SuppressWarnings("rawtypes")
|
1649 | 1704 | @Override
|
1650 | 1705 | public SpannerOptions build() {
|
@@ -1990,6 +2045,10 @@ String getMonitoringHost() {
|
1990 | 2045 | return monitoringHost;
|
1991 | 2046 | }
|
1992 | 2047 |
|
| 2048 | + public TransactionOptions getDefaultTransactionOptions() { |
| 2049 | + return defaultTransactionOptions; |
| 2050 | + } |
| 2051 | + |
1993 | 2052 | @BetaApi
|
1994 | 2053 | public boolean isUseVirtualThreads() {
|
1995 | 2054 | return useVirtualThreads;
|
|
0 commit comments