Retry, Backoff, and Idempotency Policies.

Application developers can override the default retry and backoff policies.

The default policies are to continue retrying for up to 15 minutes, and to use truncated (at 5 minutes) exponential backoff, doubling the maximum backoff period between retries.

 namespace spanner = ::google::cloud::spanner; using ::google::cloud::StatusOr; [](std::string const& project_id, std::string const& instance_id, std::string const& database_id) { // Use a truncated exponential backoff with jitter to wait between // retries: // https://en.wikipedia.org/wiki/Exponential_backoff // https://cloud.google.com/storage/docs/exponential-backoff auto client = spanner::Client(spanner::MakeConnection( spanner::Database(project_id, instance_id, database_id), google::cloud::Options{} .set<spanner::SpannerRetryPolicyOption>( std::make_shared<spanner::LimitedTimeRetryPolicy>( /*maximum_duration=*/std::chrono::seconds(60))) .set<spanner::SpannerBackoffPolicyOption>( std::make_shared<spanner::ExponentialBackoffPolicy>( /*initial_delay=*/std::chrono::milliseconds(500), /*maximum_delay=*/std::chrono::seconds(64), /*scaling=*/1.5)))); std::int64_t rows_inserted; auto commit_result = client.Commit( [&client, &rows_inserted]( spanner::Transaction txn) -> StatusOr<spanner::Mutations> { auto insert = client.ExecuteDml( std::move(txn), spanner::SqlStatement( "INSERT INTO Singers (SingerId, FirstName, LastName)" " VALUES (20, 'George', 'Washington')")); if (!insert) return std::move(insert).status(); rows_inserted = insert->RowsModified(); return spanner::Mutations{}; }); if (!commit_result) throw std::move(commit_result).status(); std::cout << "Rows inserted: " << rows_inserted; } 
See Also

LimitedTimeRetryPolicy and LimitedErrorCountRetryPolicy for alternative retry policies.

See Also

ExponentialBackoffPolicy to configure different parameters for the exponential backoff policy.