@@ -54,6 +54,22 @@ ProtoReadLockMode(
5454 }
5555}
5656
57+ google::spanner::v1::TransactionOptions_IsolationLevel ProtoIsolationLevel (
58+ absl::optional<Transaction::IsolationLevel> const & isolation_level) {
59+ if (!isolation_level) {
60+ return google::spanner::v1::TransactionOptions::ISOLATION_LEVEL_UNSPECIFIED;
61+ }
62+ switch (*isolation_level) {
63+ case Transaction::IsolationLevel::kSerializable :
64+ return google::spanner::v1::TransactionOptions::SERIALIZABLE;
65+ case Transaction::IsolationLevel::kRepeatableRead :
66+ return google::spanner::v1::TransactionOptions::REPEATABLE_READ;
67+ default :
68+ return google::spanner::v1::TransactionOptions::
69+ ISOLATION_LEVEL_UNSPECIFIED;
70+ }
71+ }
72+
5773google::spanner::v1::TransactionOptions MakeOpts (
5874 google::spanner::v1::TransactionOptions_ReadOnly ro_opts) {
5975 google::spanner::v1::TransactionOptions opts;
@@ -62,13 +78,21 @@ google::spanner::v1::TransactionOptions MakeOpts(
6278}
6379
6480google::spanner::v1::TransactionOptions MakeOpts (
65- google::spanner::v1::TransactionOptions_ReadWrite rw_opts) {
81+ google::spanner::v1::TransactionOptions_ReadWrite rw_opts,
82+ absl::optional<Transaction::IsolationLevel> isolation_level) {
6683 google::spanner::v1::TransactionOptions opts;
6784 *opts.mutable_read_write () = std::move (rw_opts);
6885 auto const & current = internal::CurrentOptions ();
6986 if (current.get <ExcludeTransactionFromChangeStreamsOption>()) {
7087 opts.set_exclude_txn_from_change_streams (true );
7188 }
89+ if (isolation_level) {
90+ opts.set_isolation_level (ProtoIsolationLevel (isolation_level));
91+ } else if (current.has <TransactionIsolationLevelOption>()) {
92+ opts.set_isolation_level (
93+ ProtoIsolationLevel (current.get <TransactionIsolationLevelOption>()));
94+ }
95+
7296 return opts;
7397}
7498
@@ -103,6 +127,13 @@ Transaction::ReadWriteOptions& Transaction::ReadWriteOptions::WithTag(
103127 return *this ;
104128}
105129
130+ Transaction::ReadWriteOptions&
131+ Transaction::ReadWriteOptions::WithIsolationLevel (
132+ IsolationLevel isolation_level) {
133+ isolation_level_ = isolation_level;
134+ return *this ;
135+ }
136+
106137Transaction::SingleUseOptions::SingleUseOptions (ReadOnlyOptions opts) {
107138 ro_opts_ = std::move (opts.ro_opts_ );
108139}
@@ -129,7 +160,8 @@ Transaction::Transaction(ReadOnlyOptions opts) {
129160
130161Transaction::Transaction (ReadWriteOptions opts) {
131162 google::spanner::v1::TransactionSelector selector;
132- *selector.mutable_begin () = MakeOpts (std::move (opts.rw_opts_ ));
163+ *selector.mutable_begin () =
164+ MakeOpts (std::move (opts.rw_opts_ ), opts.isolation_level_ );
133165 auto const route_to_leader = true ; // read-write
134166 impl_ = std::make_shared<spanner_internal::TransactionImpl>(
135167 std::move (selector), route_to_leader,
@@ -138,7 +170,8 @@ Transaction::Transaction(ReadWriteOptions opts) {
138170
139171Transaction::Transaction (Transaction const & txn, ReadWriteOptions opts) {
140172 google::spanner::v1::TransactionSelector selector;
141- *selector.mutable_begin () = MakeOpts (std::move (opts.rw_opts_ ));
173+ *selector.mutable_begin () =
174+ MakeOpts (std::move (opts.rw_opts_ ), opts.isolation_level_ );
142175 auto const route_to_leader = true ; // read-write
143176 impl_ = std::make_shared<spanner_internal::TransactionImpl>(
144177 *txn.impl_ , std::move (selector), route_to_leader,
@@ -155,7 +188,8 @@ Transaction::Transaction(SingleUseOptions opts) {
155188
156189Transaction::Transaction (ReadWriteOptions opts, SingleUseCommitTag) {
157190 google::spanner::v1::TransactionSelector selector;
158- *selector.mutable_single_use () = MakeOpts (std::move (opts.rw_opts_ ));
191+ *selector.mutable_single_use () =
192+ MakeOpts (std::move (opts.rw_opts_ ), opts.isolation_level_ );
159193 auto const route_to_leader = true ; // write
160194 impl_ = std::make_shared<spanner_internal::TransactionImpl>(
161195 std::move (selector), route_to_leader,
0 commit comments