@@ -3539,6 +3539,71 @@ void IsolationLevelSettingCommand(std::vector<std::string> argv) {
35393539 IsolationLevelSetting (argv[0 ], argv[1 ], argv[2 ]);
35403540}
35413541
3542+ // ! [START spanner_read_lock_mode]
3543+ void ReadLockModeSetting (std::string const & project_id,
3544+ std::string const & instance_id,
3545+ std::string const & database_id) {
3546+ namespace spanner = ::google::cloud::spanner;
3547+ using ::google::cloud::Options;
3548+ using ::google::cloud::StatusOr;
3549+
3550+ auto db = spanner::Database (project_id, instance_id, database_id);
3551+
3552+ // The read lock mode specified at the client-level will be applied
3553+ // to all RW transactions.
3554+ auto options = Options{}.set <spanner::TransactionReadLockModeOption>(
3555+ spanner::Transaction::ReadLockMode::kOptimistic );
3556+ auto client = spanner::Client (spanner::MakeConnection (db, options));
3557+
3558+ auto commit = client.Commit (
3559+ [&client](
3560+ spanner::Transaction const & txn) -> StatusOr<spanner::Mutations> {
3561+ // Read an AlbumTitle.
3562+ auto sql = spanner::SqlStatement (
3563+ " SELECT AlbumTitle from Albums WHERE SingerId = @SingerId and "
3564+ " AlbumId = @AlbumId" ,
3565+ {{" SingerId" , spanner::Value (2 )}, {" AlbumId" , spanner::Value (1 )}});
3566+ auto rows = client.ExecuteQuery (txn, std::move (sql));
3567+ for (auto const & row :
3568+ spanner::StreamOf<std::tuple<std::string>>(rows)) {
3569+ if (!row) return row.status ();
3570+ std::cout << " Current Album Title: " << std::get<0 >(*row) << " \n " ;
3571+ }
3572+
3573+ // Update the title.
3574+ auto update_sql = spanner::SqlStatement (
3575+ " UPDATE Albums "
3576+ " SET AlbumTitle = @AlbumTitle "
3577+ " WHERE SingerId = @SingerId and AlbumId = @AlbumId" ,
3578+ {{" AlbumTitle" , spanner::Value (" A New Title" )},
3579+ {" SingerId" , spanner::Value (2 )},
3580+ {" AlbumId" , spanner::Value (1 )}});
3581+ auto result = client.ExecuteDml (txn, std::move (update_sql));
3582+ if (!result) return result.status ();
3583+ std::cout << result->RowsModified () << " record(s) updated.\n " ;
3584+
3585+ return spanner::Mutations{};
3586+ },
3587+ // The read lock mode specified at the transaction-level takes
3588+ // precedence over the read lock mode configured at the client-level.
3589+ // kPessimistic is used here to demonstrate overriding the client-level
3590+ // setting.
3591+ Options{}.set <spanner::TransactionReadLockModeOption>(
3592+ spanner::Transaction::ReadLockMode::kPessimistic ));
3593+
3594+ if (!commit) throw std::move (commit).status ();
3595+ std::cout << " Update was successful [spanner_read_lock_mode]\n " ;
3596+ }
3597+ // ! [END spanner_read_lock_mode]
3598+
3599+ void ReadLockModeSettingCommand (std::vector<std::string> argv) {
3600+ if (argv.size () != 3 ) {
3601+ throw std::runtime_error (
3602+ " read-lock-mode-setting <project-id> <instance-id> <database-id>" );
3603+ }
3604+ ReadLockModeSetting (argv[0 ], argv[1 ], argv[2 ]);
3605+ }
3606+
35423607// ! [START spanner_get_commit_stats]
35433608void GetCommitStatistics (google::cloud::spanner::Client client) {
35443609 namespace spanner = ::google::cloud::spanner;
@@ -5258,6 +5323,7 @@ int RunOneCommand(std::vector<std::string> argv) {
52585323 ReadDataWithStoringIndex),
52595324 make_command_entry (" read-write-transaction" , ReadWriteTransaction),
52605325 {" isolation-level-setting" , IsolationLevelSettingCommand},
5326+ {" read-lock-mode-setting" , ReadLockModeSettingCommand},
52615327 make_command_entry (" get-commit-stats" , GetCommitStatistics),
52625328 make_command_entry (" dml-standard-insert" , DmlStandardInsert),
52635329 make_command_entry (" dml-standard-update" , DmlStandardUpdate),
0 commit comments