<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="spanner_v1.html">Cloud Spanner API</a> . <a href="spanner_v1.projects.html">projects</a> . <a href="spanner_v1.projects.instances.html">instances</a> . <a href="spanner_v1.projects.instances.databases.html">databases</a> . <a href="spanner_v1.projects.instances.databases.sessions.html">sessions</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#beginTransaction">beginTransaction(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Begins a new transaction. This step can often be skipped:</p>
<p class="toc_element">
  <code><a href="#commit">commit(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Commits a transaction. The request includes the mutations to be</p>
<p class="toc_element">
  <code><a href="#create">create(database, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new session. A session can be used to perform</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Ends a session, releasing server resources associated with it. This will</p>
<p class="toc_element">
  <code><a href="#executeBatchDml">executeBatchDml(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Executes a batch of SQL DML statements. This method allows many statements</p>
<p class="toc_element">
  <code><a href="#executeSql">executeSql(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Executes an SQL statement, returning all results in a single reply. This</p>
<p class="toc_element">
  <code><a href="#executeStreamingSql">executeStreamingSql(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Like ExecuteSql, except returns the result</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a session. Returns `NOT_FOUND` if the session does not exist.</p>
<p class="toc_element">
  <code><a href="#list">list(database, pageSize=None, filter=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists all sessions in a given database.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#partitionQuery">partitionQuery(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a set of partition tokens that can be used to execute a query</p>
<p class="toc_element">
  <code><a href="#partitionRead">partitionRead(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a set of partition tokens that can be used to execute a read</p>
<p class="toc_element">
  <code><a href="#read">read(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Reads rows from the database using key lookups and scans, as a</p>
<p class="toc_element">
  <code><a href="#rollback">rollback(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Rolls back a transaction, releasing any locks it holds. It is a good</p>
<p class="toc_element">
  <code><a href="#streamingRead">streamingRead(session, body, x__xgafv=None)</a></code></p>
<p class="firstline">Like Read, except returns the result set as a</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="beginTransaction">beginTransaction(session, body, x__xgafv=None)</code>
  <pre>Begins a new transaction. This step can often be skipped:
Read, ExecuteSql and
Commit can begin a new transaction as a
side-effect.

Args:
  session: string, Required. The session in which the transaction runs. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for BeginTransaction.
    "options": { # # Transactions # Required. Options for the new transaction.
        #
        #
        # Each session can have at most one active transaction at a time. After the
        # active transaction is completed, the session can immediately be
        # re-used for the next transaction. It is not necessary to create a
        # new session for each transaction.
        #
        # # Transaction Modes
        #
        # Cloud Spanner supports three transaction modes:
        #
        #   1. Locking read-write. This type of transaction is the only way
        #      to write data into Cloud Spanner. These transactions rely on
        #      pessimistic locking and, if necessary, two-phase commit.
        #      Locking read-write transactions may abort, requiring the
        #      application to retry.
        #
        #   2. Snapshot read-only. This transaction type provides guaranteed
        #      consistency across several reads, but does not allow
        #      writes. Snapshot read-only transactions can be configured to
        #      read at timestamps in the past. Snapshot read-only
        #      transactions do not need to be committed.
        #
        #   3. Partitioned DML. This type of transaction is used to execute
        #      a single Partitioned DML statement. Partitioned DML partitions
        #      the key space and runs the DML statement over each partition
        #      in parallel using separate, internal transactions that commit
        #      independently. Partitioned DML transactions do not need to be
        #      committed.
        #
        # For transactions that only read, snapshot read-only transactions
        # provide simpler semantics and are almost always faster. In
        # particular, read-only transactions do not take locks, so they do
        # not conflict with read-write transactions. As a consequence of not
        # taking locks, they also do not abort, so retry loops are not needed.
        #
        # Transactions may only read/write data in a single database. They
        # may, however, read/write data in different tables within that
        # database.
        #
        # ## Locking Read-Write Transactions
        #
        # Locking transactions may be used to atomically read-modify-write
        # data anywhere in a database. This type of transaction is externally
        # consistent.
        #
        # Clients should attempt to minimize the amount of time a transaction
        # is active. Faster transactions commit with higher probability
        # and cause less contention. Cloud Spanner attempts to keep read locks
        # active as long as the transaction continues to do reads, and the
        # transaction has not been terminated by
        # Commit or
        # Rollback.  Long periods of
        # inactivity at the client may cause Cloud Spanner to release a
        # transaction's locks and abort it.
        #
        # Conceptually, a read-write transaction consists of zero or more
        # reads or SQL statements followed by
        # Commit. At any time before
        # Commit, the client can send a
        # Rollback request to abort the
        # transaction.
        #
        # ### Semantics
        #
        # Cloud Spanner can commit the transaction if all read locks it acquired
        # are still valid at commit time, and it is able to acquire write
        # locks for all writes. Cloud Spanner can abort the transaction for any
        # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
        # that the transaction has not modified any user data in Cloud Spanner.
        #
        # Unless the transaction commits, Cloud Spanner makes no guarantees about
        # how long the transaction's locks were held for. It is an error to
        # use Cloud Spanner locks for any sort of mutual exclusion other than
        # between Cloud Spanner transactions themselves.
        #
        # ### Retrying Aborted Transactions
        #
        # When a transaction aborts, the application can choose to retry the
        # whole transaction again. To maximize the chances of successfully
        # committing the retry, the client should execute the retry in the
        # same session as the original attempt. The original session's lock
        # priority increases with each consecutive abort, meaning that each
        # attempt has a slightly better chance of success than the previous.
        #
        # Under some circumstances (e.g., many transactions attempting to
        # modify the same row(s)), a transaction can abort many times in a
        # short period before successfully committing. Thus, it is not a good
        # idea to cap the number of retries a transaction can attempt;
        # instead, it is better to limit the total amount of wall time spent
        # retrying.
        #
        # ### Idle Transactions
        #
        # A transaction is considered idle if it has no outstanding reads or
        # SQL queries and has not started a read or SQL query within the last 10
        # seconds. Idle transactions can be aborted by Cloud Spanner so that they
        # don't hold on to locks indefinitely. In that case, the commit will
        # fail with error `ABORTED`.
        #
        # If this behavior is undesirable, periodically executing a simple
        # SQL query in the transaction (e.g., `SELECT 1`) prevents the
        # transaction from becoming idle.
        #
        # ## Snapshot Read-Only Transactions
        #
        # Snapshot read-only transactions provides a simpler method than
        # locking read-write transactions for doing several consistent
        # reads. However, this type of transaction does not support writes.
        #
        # Snapshot transactions do not take locks. Instead, they work by
        # choosing a Cloud Spanner timestamp, then executing all reads at that
        # timestamp. Since they do not acquire locks, they do not block
        # concurrent read-write transactions.
        #
        # Unlike locking read-write transactions, snapshot read-only
        # transactions never abort. They can fail if the chosen read
        # timestamp is garbage collected; however, the default garbage
        # collection policy is generous enough that most applications do not
        # need to worry about this in practice.
        #
        # Snapshot read-only transactions do not need to call
        # Commit or
        # Rollback (and in fact are not
        # permitted to do so).
        #
        # To execute a snapshot transaction, the client specifies a timestamp
        # bound, which tells Cloud Spanner how to choose a read timestamp.
        #
        # The types of timestamp bound are:
        #
        #   - Strong (the default).
        #   - Bounded staleness.
        #   - Exact staleness.
        #
        # If the Cloud Spanner database to be read is geographically distributed,
        # stale read-only transactions can execute more quickly than strong
        # or read-write transaction, because they are able to execute far
        # from the leader replica.
        #
        # Each type of timestamp bound is discussed in detail below.
        #
        # ### Strong
        #
        # Strong reads are guaranteed to see the effects of all transactions
        # that have committed before the start of the read. Furthermore, all
        # rows yielded by a single read are consistent with each other -- if
        # any part of the read observes a transaction, all parts of the read
        # see the transaction.
        #
        # Strong reads are not repeatable: two consecutive strong read-only
        # transactions might return inconsistent results if there are
        # concurrent writes. If consistency across reads is required, the
        # reads should be executed within a transaction or at an exact read
        # timestamp.
        #
        # See TransactionOptions.ReadOnly.strong.
        #
        # ### Exact Staleness
        #
        # These timestamp bounds execute reads at a user-specified
        # timestamp. Reads at a timestamp are guaranteed to see a consistent
        # prefix of the global transaction history: they observe
        # modifications done by all transactions with a commit timestamp <=
        # the read timestamp, and observe none of the modifications done by
        # transactions with a larger commit timestamp. They will block until
        # all conflicting transactions that may be assigned commit timestamps
        # <= the read timestamp have finished.
        #
        # The timestamp can either be expressed as an absolute Cloud Spanner commit
        # timestamp or a staleness relative to the current time.
        #
        # These modes do not require a "negotiation phase" to pick a
        # timestamp. As a result, they execute slightly faster than the
        # equivalent boundedly stale concurrency modes. On the other hand,
        # boundedly stale reads usually return fresher results.
        #
        # See TransactionOptions.ReadOnly.read_timestamp and
        # TransactionOptions.ReadOnly.exact_staleness.
        #
        # ### Bounded Staleness
        #
        # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
        # subject to a user-provided staleness bound. Cloud Spanner chooses the
        # newest timestamp within the staleness bound that allows execution
        # of the reads at the closest available replica without blocking.
        #
        # All rows yielded are consistent with each other -- if any part of
        # the read observes a transaction, all parts of the read see the
        # transaction. Boundedly stale reads are not repeatable: two stale
        # reads, even if they use the same staleness bound, can execute at
        # different timestamps and thus return inconsistent results.
        #
        # Boundedly stale reads execute in two phases: the first phase
        # negotiates a timestamp among all replicas needed to serve the
        # read. In the second phase, reads are executed at the negotiated
        # timestamp.
        #
        # As a result of the two phase execution, bounded staleness reads are
        # usually a little slower than comparable exact staleness
        # reads. However, they are typically able to return fresher
        # results, and are more likely to execute at the closest replica.
        #
        # Because the timestamp negotiation requires up-front knowledge of
        # which rows will be read, it can only be used with single-use
        # read-only transactions.
        #
        # See TransactionOptions.ReadOnly.max_staleness and
        # TransactionOptions.ReadOnly.min_read_timestamp.
        #
        # ### Old Read Timestamps and Garbage Collection
        #
        # Cloud Spanner continuously garbage collects deleted and overwritten data
        # in the background to reclaim storage space. This process is known
        # as "version GC". By default, version GC reclaims versions after they
        # are one hour old. Because of this, Cloud Spanner cannot perform reads
        # at read timestamps more than one hour in the past. This
        # restriction also applies to in-progress reads and/or SQL queries whose
        # timestamp become too old while executing. Reads and SQL queries with
        # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
        #
        # ## Partitioned DML Transactions
        #
        # Partitioned DML transactions are used to execute DML statements with a
        # different execution strategy that provides different, and often better,
        # scalability properties for large, table-wide operations than DML in a
        # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
        # should prefer using ReadWrite transactions.
        #
        # Partitioned DML partitions the keyspace and runs the DML statement on each
        # partition in separate, internal transactions. These transactions commit
        # automatically when complete, and run independently from one another.
        #
        # To reduce lock contention, this execution strategy only acquires read locks
        # on rows that match the WHERE clause of the statement. Additionally, the
        # smaller per-partition transactions hold locks for less time.
        #
        # That said, Partitioned DML is not a drop-in replacement for standard DML used
        # in ReadWrite transactions.
        #
        #  - The DML statement must be fully-partitionable. Specifically, the statement
        #    must be expressible as the union of many statements which each access only
        #    a single row of the table.
        #
        #  - The statement is not applied atomically to all rows of the table. Rather,
        #    the statement is applied atomically to partitions of the table, in
        #    independent transactions. Secondary index rows are updated atomically
        #    with the base table rows.
        #
        #  - Partitioned DML does not guarantee exactly-once execution semantics
        #    against a partition. The statement will be applied at least once to each
        #    partition. It is strongly recommended that the DML statement should be
        #    idempotent to avoid unexpected results. For instance, it is potentially
        #    dangerous to run a statement such as
        #    `UPDATE table SET column = column + 1` as it could be run multiple times
        #    against some rows.
        #
        #  - The partitions are committed automatically - there is no support for
        #    Commit or Rollback. If the call returns an error, or if the client issuing
        #    the ExecuteSql call dies, it is possible that some rows had the statement
        #    executed on them successfully. It is also possible that statement was
        #    never executed against other rows.
        #
        #  - Partitioned DML transactions may only contain the execution of a single
        #    DML statement via ExecuteSql or ExecuteStreamingSql.
        #
        #  - If any error is encountered during the execution of the partitioned DML
        #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
        #    value that cannot be stored due to schema constraints), then the
        #    operation is stopped at that point and an error is returned. It is
        #    possible that at this point, some partitions have been committed (or even
        #    committed multiple times), and other partitions have not been run at all.
        #
        # Given the above, Partitioned DML is good fit for large, database-wide,
        # operations that are idempotent, such as deleting old rows from a very large
        # table.
      "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
          #
          # Authorization to begin a read-write transaction requires
          # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
          # on the `session` resource.
          # transaction type has no options.
      },
      "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
          #
          # Authorization to begin a read-only transaction requires
          # `spanner.databases.beginReadOnlyTransaction` permission
          # on the `session` resource.
        "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
            #
            # This is useful for requesting fresher data than some previous
            # read, or data that is fresh enough to observe the effects of some
            # previously committed transaction whose timestamp is known.
            #
            # Note that this option can only be used in single-use transactions.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
            # the Transaction message that describes the transaction.
        "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
            # seconds. Guarantees that all writes that have committed more
            # than the specified number of seconds ago are visible. Because
            # Cloud Spanner chooses the exact timestamp, this mode works even if
            # the client's local clock is substantially skewed from Cloud Spanner
            # commit timestamps.
            #
            # Useful for reading the freshest data available at a nearby
            # replica, while bounding the possible staleness if the local
            # replica has fallen behind.
            #
            # Note that this option can only be used in single-use
            # transactions.
        "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
            # old. The timestamp is chosen soon after the read is started.
            #
            # Guarantees that all writes that have committed more than the
            # specified number of seconds ago are visible. Because Cloud Spanner
            # chooses the exact timestamp, this mode works even if the client's
            # local clock is substantially skewed from Cloud Spanner commit
            # timestamps.
            #
            # Useful for reading at nearby replicas without the distributed
            # timestamp negotiation overhead of `max_staleness`.
        "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
            # reads at a specific timestamp are repeatable; the same read at
            # the same timestamp always returns the same data. If the
            # timestamp is in the future, the read will block until the
            # specified timestamp, modulo the read's deadline.
            #
            # Useful for large scale consistent reads such as mapreduces, or
            # for coordinating many reads against a consistent snapshot of the
            # data.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "strong": True or False, # Read at a timestamp where all previously committed transactions
            # are visible.
      },
      "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
          #
          # Authorization to begin a Partitioned DML transaction requires
          # `spanner.databases.beginPartitionedDmlTransaction` permission
          # on the `session` resource.
      },
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A transaction.
    "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
        # for the transaction. Not returned by default: see
        # TransactionOptions.ReadOnly.return_read_timestamp.
        #
        # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
        # Example: `"2014-10-02T15:01:23.045123456Z"`.
    "id": "A String", # `id` may be used to identify the transaction in subsequent
        # Read,
        # ExecuteSql,
        # Commit, or
        # Rollback calls.
        #
        # Single-use read-only transactions do not have IDs, because
        # single-use transactions do not support multiple requests.
  }</pre>
</div>

<div class="method">
    <code class="details" id="commit">commit(session, body, x__xgafv=None)</code>
  <pre>Commits a transaction. The request includes the mutations to be
applied to rows in the database.

`Commit` might return an `ABORTED` error. This can occur at any time;
commonly, the cause is conflicts with concurrent
transactions. However, it can also happen for a variety of other
reasons. If `Commit` returns `ABORTED`, the caller should re-attempt
the transaction from the beginning, re-using the same session.

Args:
  session: string, Required. The session in which the transaction to be committed is running. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for Commit.
    "transactionId": "A String", # Commit a previously-started transaction.
    "mutations": [ # The mutations to be executed when this transaction commits. All
        # mutations are applied atomically, in the order they appear in
        # this list.
      { # A modification to one or more Cloud Spanner rows.  Mutations can be
          # applied to a Cloud Spanner database by sending them in a
          # Commit call.
        "insert": { # Arguments to insert, update, insert_or_update, and # Insert new rows in a table. If any of the rows already exist,
            # the write or transaction fails with error `ALREADY_EXISTS`.
            # replace operations.
          "table": "A String", # Required. The table whose rows will be written.
          "values": [ # The values to be written. `values` can contain more than one
              # list of values. If it does, then multiple rows are written, one
              # for each entry in `values`. Each list in `values` must have
              # exactly as many entries as there are entries in columns
              # above. Sending multiple lists is equivalent to sending multiple
              # `Mutation`s, each containing one `values` entry and repeating
              # table and columns. Individual values in each list are
              # encoded as described here.
            [
              "",
            ],
          ],
          "columns": [ # The names of the columns in table to be written.
              #
              # The list of columns must contain enough columns to allow
              # Cloud Spanner to derive values for all primary key columns in the
              # row(s) to be modified.
            "A String",
          ],
        },
        "replace": { # Arguments to insert, update, insert_or_update, and # Like insert, except that if the row already exists, it is
            # deleted, and the column values provided are inserted
            # instead. Unlike insert_or_update, this means any values not
            # explicitly written become `NULL`.
            # replace operations.
          "table": "A String", # Required. The table whose rows will be written.
          "values": [ # The values to be written. `values` can contain more than one
              # list of values. If it does, then multiple rows are written, one
              # for each entry in `values`. Each list in `values` must have
              # exactly as many entries as there are entries in columns
              # above. Sending multiple lists is equivalent to sending multiple
              # `Mutation`s, each containing one `values` entry and repeating
              # table and columns. Individual values in each list are
              # encoded as described here.
            [
              "",
            ],
          ],
          "columns": [ # The names of the columns in table to be written.
              #
              # The list of columns must contain enough columns to allow
              # Cloud Spanner to derive values for all primary key columns in the
              # row(s) to be modified.
            "A String",
          ],
        },
        "insertOrUpdate": { # Arguments to insert, update, insert_or_update, and # Like insert, except that if the row already exists, then
            # its column values are overwritten with the ones provided. Any
            # column values not explicitly written are preserved.
            # replace operations.
          "table": "A String", # Required. The table whose rows will be written.
          "values": [ # The values to be written. `values` can contain more than one
              # list of values. If it does, then multiple rows are written, one
              # for each entry in `values`. Each list in `values` must have
              # exactly as many entries as there are entries in columns
              # above. Sending multiple lists is equivalent to sending multiple
              # `Mutation`s, each containing one `values` entry and repeating
              # table and columns. Individual values in each list are
              # encoded as described here.
            [
              "",
            ],
          ],
          "columns": [ # The names of the columns in table to be written.
              #
              # The list of columns must contain enough columns to allow
              # Cloud Spanner to derive values for all primary key columns in the
              # row(s) to be modified.
            "A String",
          ],
        },
        "update": { # Arguments to insert, update, insert_or_update, and # Update existing rows in a table. If any of the rows does not
            # already exist, the transaction fails with error `NOT_FOUND`.
            # replace operations.
          "table": "A String", # Required. The table whose rows will be written.
          "values": [ # The values to be written. `values` can contain more than one
              # list of values. If it does, then multiple rows are written, one
              # for each entry in `values`. Each list in `values` must have
              # exactly as many entries as there are entries in columns
              # above. Sending multiple lists is equivalent to sending multiple
              # `Mutation`s, each containing one `values` entry and repeating
              # table and columns. Individual values in each list are
              # encoded as described here.
            [
              "",
            ],
          ],
          "columns": [ # The names of the columns in table to be written.
              #
              # The list of columns must contain enough columns to allow
              # Cloud Spanner to derive values for all primary key columns in the
              # row(s) to be modified.
            "A String",
          ],
        },
        "delete": { # Arguments to delete operations. # Delete rows from a table. Succeeds whether or not the named
            # rows were present.
          "table": "A String", # Required. The table whose rows will be deleted.
          "keySet": { # `KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All # Required. The primary keys of the rows within table to delete.
              # Delete is idempotent. The transaction will succeed even if some or all
              # rows do not exist.
              # the keys are expected to be in the same table or index. The keys need
              # not be sorted in any particular way.
              #
              # If the same key is specified multiple times in the set (for example
              # if two ranges, two keys, or a key and a range overlap), Cloud Spanner
              # behaves as if the key were only specified once.
            "ranges": [ # A list of key ranges. See KeyRange for more information about
                # key range specifications.
              { # KeyRange represents a range of rows in a table or index.
                  #
                  # A range has a start key and an end key. These keys can be open or
                  # closed, indicating if the range includes rows with that key.
                  #
                  # Keys are represented by lists, where the ith value in the list
                  # corresponds to the ith component of the table or index primary key.
                  # Individual values are encoded as described
                  # here.
                  #
                  # For example, consider the following table definition:
                  #
                  #     CREATE TABLE UserEvents (
                  #       UserName STRING(MAX),
                  #       EventDate STRING(10)
                  #     ) PRIMARY KEY(UserName, EventDate);
                  #
                  # The following keys name rows in this table:
                  #
                  #     "Bob", "2014-09-23"
                  #
                  # Since the `UserEvents` table's `PRIMARY KEY` clause names two
                  # columns, each `UserEvents` key has two elements; the first is the
                  # `UserName`, and the second is the `EventDate`.
                  #
                  # Key ranges with multiple components are interpreted
                  # lexicographically by component using the table or index key's declared
                  # sort order. For example, the following range returns all events for
                  # user `"Bob"` that occurred in the year 2015:
                  #
                  #     "start_closed": ["Bob", "2015-01-01"]
                  #     "end_closed": ["Bob", "2015-12-31"]
                  #
                  # Start and end keys can omit trailing key components. This affects the
                  # inclusion and exclusion of rows that exactly match the provided key
                  # components: if the key is closed, then rows that exactly match the
                  # provided components are included; if the key is open, then rows
                  # that exactly match are not included.
                  #
                  # For example, the following range includes all events for `"Bob"` that
                  # occurred during and after the year 2000:
                  #
                  #     "start_closed": ["Bob", "2000-01-01"]
                  #     "end_closed": ["Bob"]
                  #
                  # The next example retrieves all events for `"Bob"`:
                  #
                  #     "start_closed": ["Bob"]
                  #     "end_closed": ["Bob"]
                  #
                  # To retrieve events before the year 2000:
                  #
                  #     "start_closed": ["Bob"]
                  #     "end_open": ["Bob", "2000-01-01"]
                  #
                  # The following range includes all rows in the table:
                  #
                  #     "start_closed": []
                  #     "end_closed": []
                  #
                  # This range returns all users whose `UserName` begins with any
                  # character from A to C:
                  #
                  #     "start_closed": ["A"]
                  #     "end_open": ["D"]
                  #
                  # This range returns all users whose `UserName` begins with B:
                  #
                  #     "start_closed": ["B"]
                  #     "end_open": ["C"]
                  #
                  # Key ranges honor column sort order. For example, suppose a table is
                  # defined as follows:
                  #
                  #     CREATE TABLE DescendingSortedTable {
                  #       Key INT64,
                  #       ...
                  #     ) PRIMARY KEY(Key DESC);
                  #
                  # The following range retrieves all rows with key values between 1
                  # and 100 inclusive:
                  #
                  #     "start_closed": ["100"]
                  #     "end_closed": ["1"]
                  #
                  # Note that 100 is passed as the start, and 1 is passed as the end,
                  # because `Key` is a descending column in the schema.
                "endOpen": [ # If the end is open, then the range excludes rows whose first
                    # `len(end_open)` key columns exactly match `end_open`.
                  "",
                ],
                "startOpen": [ # If the start is open, then the range excludes rows whose first
                    # `len(start_open)` key columns exactly match `start_open`.
                  "",
                ],
                "endClosed": [ # If the end is closed, then the range includes all rows whose
                    # first `len(end_closed)` key columns exactly match `end_closed`.
                  "",
                ],
                "startClosed": [ # If the start is closed, then the range includes all rows whose
                    # first `len(start_closed)` key columns exactly match `start_closed`.
                  "",
                ],
              },
            ],
            "keys": [ # A list of specific keys. Entries in `keys` should have exactly as
                # many elements as there are columns in the primary or index key
                # with which this `KeySet` is used.  Individual key values are
                # encoded as described here.
              [
                "",
              ],
            ],
            "all": True or False, # For convenience `all` can be set to `true` to indicate that this
                # `KeySet` matches all keys in the table or index. Note that any keys
                # specified in `keys` or `ranges` are only yielded once.
          },
        },
      },
    ],
    "singleUseTransaction": { # # Transactions # Execute mutations in a temporary transaction. Note that unlike
        # commit of a previously-started transaction, commit with a
        # temporary transaction is non-idempotent. That is, if the
        # `CommitRequest` is sent to Cloud Spanner more than once (for
        # instance, due to retries in the application, or in the
        # transport library), it is possible that the mutations are
        # executed more than once. If this is undesirable, use
        # BeginTransaction and
        # Commit instead.
        #
        #
        # Each session can have at most one active transaction at a time. After the
        # active transaction is completed, the session can immediately be
        # re-used for the next transaction. It is not necessary to create a
        # new session for each transaction.
        #
        # # Transaction Modes
        #
        # Cloud Spanner supports three transaction modes:
        #
        #   1. Locking read-write. This type of transaction is the only way
        #      to write data into Cloud Spanner. These transactions rely on
        #      pessimistic locking and, if necessary, two-phase commit.
        #      Locking read-write transactions may abort, requiring the
        #      application to retry.
        #
        #   2. Snapshot read-only. This transaction type provides guaranteed
        #      consistency across several reads, but does not allow
        #      writes. Snapshot read-only transactions can be configured to
        #      read at timestamps in the past. Snapshot read-only
        #      transactions do not need to be committed.
        #
        #   3. Partitioned DML. This type of transaction is used to execute
        #      a single Partitioned DML statement. Partitioned DML partitions
        #      the key space and runs the DML statement over each partition
        #      in parallel using separate, internal transactions that commit
        #      independently. Partitioned DML transactions do not need to be
        #      committed.
        #
        # For transactions that only read, snapshot read-only transactions
        # provide simpler semantics and are almost always faster. In
        # particular, read-only transactions do not take locks, so they do
        # not conflict with read-write transactions. As a consequence of not
        # taking locks, they also do not abort, so retry loops are not needed.
        #
        # Transactions may only read/write data in a single database. They
        # may, however, read/write data in different tables within that
        # database.
        #
        # ## Locking Read-Write Transactions
        #
        # Locking transactions may be used to atomically read-modify-write
        # data anywhere in a database. This type of transaction is externally
        # consistent.
        #
        # Clients should attempt to minimize the amount of time a transaction
        # is active. Faster transactions commit with higher probability
        # and cause less contention. Cloud Spanner attempts to keep read locks
        # active as long as the transaction continues to do reads, and the
        # transaction has not been terminated by
        # Commit or
        # Rollback.  Long periods of
        # inactivity at the client may cause Cloud Spanner to release a
        # transaction's locks and abort it.
        #
        # Conceptually, a read-write transaction consists of zero or more
        # reads or SQL statements followed by
        # Commit. At any time before
        # Commit, the client can send a
        # Rollback request to abort the
        # transaction.
        #
        # ### Semantics
        #
        # Cloud Spanner can commit the transaction if all read locks it acquired
        # are still valid at commit time, and it is able to acquire write
        # locks for all writes. Cloud Spanner can abort the transaction for any
        # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
        # that the transaction has not modified any user data in Cloud Spanner.
        #
        # Unless the transaction commits, Cloud Spanner makes no guarantees about
        # how long the transaction's locks were held for. It is an error to
        # use Cloud Spanner locks for any sort of mutual exclusion other than
        # between Cloud Spanner transactions themselves.
        #
        # ### Retrying Aborted Transactions
        #
        # When a transaction aborts, the application can choose to retry the
        # whole transaction again. To maximize the chances of successfully
        # committing the retry, the client should execute the retry in the
        # same session as the original attempt. The original session's lock
        # priority increases with each consecutive abort, meaning that each
        # attempt has a slightly better chance of success than the previous.
        #
        # Under some circumstances (e.g., many transactions attempting to
        # modify the same row(s)), a transaction can abort many times in a
        # short period before successfully committing. Thus, it is not a good
        # idea to cap the number of retries a transaction can attempt;
        # instead, it is better to limit the total amount of wall time spent
        # retrying.
        #
        # ### Idle Transactions
        #
        # A transaction is considered idle if it has no outstanding reads or
        # SQL queries and has not started a read or SQL query within the last 10
        # seconds. Idle transactions can be aborted by Cloud Spanner so that they
        # don't hold on to locks indefinitely. In that case, the commit will
        # fail with error `ABORTED`.
        #
        # If this behavior is undesirable, periodically executing a simple
        # SQL query in the transaction (e.g., `SELECT 1`) prevents the
        # transaction from becoming idle.
        #
        # ## Snapshot Read-Only Transactions
        #
        # Snapshot read-only transactions provides a simpler method than
        # locking read-write transactions for doing several consistent
        # reads. However, this type of transaction does not support writes.
        #
        # Snapshot transactions do not take locks. Instead, they work by
        # choosing a Cloud Spanner timestamp, then executing all reads at that
        # timestamp. Since they do not acquire locks, they do not block
        # concurrent read-write transactions.
        #
        # Unlike locking read-write transactions, snapshot read-only
        # transactions never abort. They can fail if the chosen read
        # timestamp is garbage collected; however, the default garbage
        # collection policy is generous enough that most applications do not
        # need to worry about this in practice.
        #
        # Snapshot read-only transactions do not need to call
        # Commit or
        # Rollback (and in fact are not
        # permitted to do so).
        #
        # To execute a snapshot transaction, the client specifies a timestamp
        # bound, which tells Cloud Spanner how to choose a read timestamp.
        #
        # The types of timestamp bound are:
        #
        #   - Strong (the default).
        #   - Bounded staleness.
        #   - Exact staleness.
        #
        # If the Cloud Spanner database to be read is geographically distributed,
        # stale read-only transactions can execute more quickly than strong
        # or read-write transaction, because they are able to execute far
        # from the leader replica.
        #
        # Each type of timestamp bound is discussed in detail below.
        #
        # ### Strong
        #
        # Strong reads are guaranteed to see the effects of all transactions
        # that have committed before the start of the read. Furthermore, all
        # rows yielded by a single read are consistent with each other -- if
        # any part of the read observes a transaction, all parts of the read
        # see the transaction.
        #
        # Strong reads are not repeatable: two consecutive strong read-only
        # transactions might return inconsistent results if there are
        # concurrent writes. If consistency across reads is required, the
        # reads should be executed within a transaction or at an exact read
        # timestamp.
        #
        # See TransactionOptions.ReadOnly.strong.
        #
        # ### Exact Staleness
        #
        # These timestamp bounds execute reads at a user-specified
        # timestamp. Reads at a timestamp are guaranteed to see a consistent
        # prefix of the global transaction history: they observe
        # modifications done by all transactions with a commit timestamp <=
        # the read timestamp, and observe none of the modifications done by
        # transactions with a larger commit timestamp. They will block until
        # all conflicting transactions that may be assigned commit timestamps
        # <= the read timestamp have finished.
        #
        # The timestamp can either be expressed as an absolute Cloud Spanner commit
        # timestamp or a staleness relative to the current time.
        #
        # These modes do not require a "negotiation phase" to pick a
        # timestamp. As a result, they execute slightly faster than the
        # equivalent boundedly stale concurrency modes. On the other hand,
        # boundedly stale reads usually return fresher results.
        #
        # See TransactionOptions.ReadOnly.read_timestamp and
        # TransactionOptions.ReadOnly.exact_staleness.
        #
        # ### Bounded Staleness
        #
        # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
        # subject to a user-provided staleness bound. Cloud Spanner chooses the
        # newest timestamp within the staleness bound that allows execution
        # of the reads at the closest available replica without blocking.
        #
        # All rows yielded are consistent with each other -- if any part of
        # the read observes a transaction, all parts of the read see the
        # transaction. Boundedly stale reads are not repeatable: two stale
        # reads, even if they use the same staleness bound, can execute at
        # different timestamps and thus return inconsistent results.
        #
        # Boundedly stale reads execute in two phases: the first phase
        # negotiates a timestamp among all replicas needed to serve the
        # read. In the second phase, reads are executed at the negotiated
        # timestamp.
        #
        # As a result of the two phase execution, bounded staleness reads are
        # usually a little slower than comparable exact staleness
        # reads. However, they are typically able to return fresher
        # results, and are more likely to execute at the closest replica.
        #
        # Because the timestamp negotiation requires up-front knowledge of
        # which rows will be read, it can only be used with single-use
        # read-only transactions.
        #
        # See TransactionOptions.ReadOnly.max_staleness and
        # TransactionOptions.ReadOnly.min_read_timestamp.
        #
        # ### Old Read Timestamps and Garbage Collection
        #
        # Cloud Spanner continuously garbage collects deleted and overwritten data
        # in the background to reclaim storage space. This process is known
        # as "version GC". By default, version GC reclaims versions after they
        # are one hour old. Because of this, Cloud Spanner cannot perform reads
        # at read timestamps more than one hour in the past. This
        # restriction also applies to in-progress reads and/or SQL queries whose
        # timestamp become too old while executing. Reads and SQL queries with
        # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
        #
        # ## Partitioned DML Transactions
        #
        # Partitioned DML transactions are used to execute DML statements with a
        # different execution strategy that provides different, and often better,
        # scalability properties for large, table-wide operations than DML in a
        # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
        # should prefer using ReadWrite transactions.
        #
        # Partitioned DML partitions the keyspace and runs the DML statement on each
        # partition in separate, internal transactions. These transactions commit
        # automatically when complete, and run independently from one another.
        #
        # To reduce lock contention, this execution strategy only acquires read locks
        # on rows that match the WHERE clause of the statement. Additionally, the
        # smaller per-partition transactions hold locks for less time.
        #
        # That said, Partitioned DML is not a drop-in replacement for standard DML used
        # in ReadWrite transactions.
        #
        #  - The DML statement must be fully-partitionable. Specifically, the statement
        #    must be expressible as the union of many statements which each access only
        #    a single row of the table.
        #
        #  - The statement is not applied atomically to all rows of the table. Rather,
        #    the statement is applied atomically to partitions of the table, in
        #    independent transactions. Secondary index rows are updated atomically
        #    with the base table rows.
        #
        #  - Partitioned DML does not guarantee exactly-once execution semantics
        #    against a partition. The statement will be applied at least once to each
        #    partition. It is strongly recommended that the DML statement should be
        #    idempotent to avoid unexpected results. For instance, it is potentially
        #    dangerous to run a statement such as
        #    `UPDATE table SET column = column + 1` as it could be run multiple times
        #    against some rows.
        #
        #  - The partitions are committed automatically - there is no support for
        #    Commit or Rollback. If the call returns an error, or if the client issuing
        #    the ExecuteSql call dies, it is possible that some rows had the statement
        #    executed on them successfully. It is also possible that statement was
        #    never executed against other rows.
        #
        #  - Partitioned DML transactions may only contain the execution of a single
        #    DML statement via ExecuteSql or ExecuteStreamingSql.
        #
        #  - If any error is encountered during the execution of the partitioned DML
        #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
        #    value that cannot be stored due to schema constraints), then the
        #    operation is stopped at that point and an error is returned. It is
        #    possible that at this point, some partitions have been committed (or even
        #    committed multiple times), and other partitions have not been run at all.
        #
        # Given the above, Partitioned DML is good fit for large, database-wide,
        # operations that are idempotent, such as deleting old rows from a very large
        # table.
      "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
          #
          # Authorization to begin a read-write transaction requires
          # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
          # on the `session` resource.
          # transaction type has no options.
      },
      "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
          #
          # Authorization to begin a read-only transaction requires
          # `spanner.databases.beginReadOnlyTransaction` permission
          # on the `session` resource.
        "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
            #
            # This is useful for requesting fresher data than some previous
            # read, or data that is fresh enough to observe the effects of some
            # previously committed transaction whose timestamp is known.
            #
            # Note that this option can only be used in single-use transactions.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
            # the Transaction message that describes the transaction.
        "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
            # seconds. Guarantees that all writes that have committed more
            # than the specified number of seconds ago are visible. Because
            # Cloud Spanner chooses the exact timestamp, this mode works even if
            # the client's local clock is substantially skewed from Cloud Spanner
            # commit timestamps.
            #
            # Useful for reading the freshest data available at a nearby
            # replica, while bounding the possible staleness if the local
            # replica has fallen behind.
            #
            # Note that this option can only be used in single-use
            # transactions.
        "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
            # old. The timestamp is chosen soon after the read is started.
            #
            # Guarantees that all writes that have committed more than the
            # specified number of seconds ago are visible. Because Cloud Spanner
            # chooses the exact timestamp, this mode works even if the client's
            # local clock is substantially skewed from Cloud Spanner commit
            # timestamps.
            #
            # Useful for reading at nearby replicas without the distributed
            # timestamp negotiation overhead of `max_staleness`.
        "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
            # reads at a specific timestamp are repeatable; the same read at
            # the same timestamp always returns the same data. If the
            # timestamp is in the future, the read will block until the
            # specified timestamp, modulo the read's deadline.
            #
            # Useful for large scale consistent reads such as mapreduces, or
            # for coordinating many reads against a consistent snapshot of the
            # data.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "strong": True or False, # Read at a timestamp where all previously committed transactions
            # are visible.
      },
      "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
          #
          # Authorization to begin a Partitioned DML transaction requires
          # `spanner.databases.beginPartitionedDmlTransaction` permission
          # on the `session` resource.
      },
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for Commit.
    "commitTimestamp": "A String", # The Cloud Spanner timestamp at which the transaction committed.
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(database, body, x__xgafv=None)</code>
  <pre>Creates a new session. A session can be used to perform
transactions that read and/or modify data in a Cloud Spanner database.
Sessions are meant to be reused for many consecutive
transactions.

Sessions can only execute one transaction at a time. To execute
multiple concurrent read-write/write-only transactions, create
multiple sessions. Note that standalone reads and queries use a
transaction internally, and count toward the one transaction
limit.

Cloud Spanner limits the number of sessions that can exist at any given
time; thus, it is a good idea to delete idle and/or unneeded sessions.
Aside from explicit deletes, Cloud Spanner can delete sessions for which no
operations are sent for more than an hour. If a session is deleted,
requests to it return `NOT_FOUND`.

Idle sessions can be kept alive by sending a trivial SQL query
periodically, e.g., `"SELECT 1"`.

Args:
  database: string, Required. The database in which the new session is created. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for CreateSession.
    "session": { # A session in the Cloud Spanner API. # The session to create.
      "labels": { # The labels for the session.
          #
          #  * Label keys must be between 1 and 63 characters long and must conform to
          #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
          #  * Label values must be between 0 and 63 characters long and must conform
          #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
          #  * No more than 64 labels can be associated with a given session.
          #
          # See https://goo.gl/xmQnxf for more information on and examples of labels.
        "a_key": "A String",
      },
      "name": "A String", # The name of the session. This is always system-assigned; values provided
          # when creating a session are ignored.
      "approximateLastUseTime": "A String", # Output only. The approximate timestamp when the session is last used. It is
          # typically earlier than the actual last use time.
      "createTime": "A String", # Output only. The timestamp when the session is created.
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A session in the Cloud Spanner API.
    "labels": { # The labels for the session.
        #
        #  * Label keys must be between 1 and 63 characters long and must conform to
        #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
        #  * Label values must be between 0 and 63 characters long and must conform
        #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
        #  * No more than 64 labels can be associated with a given session.
        #
        # See https://goo.gl/xmQnxf for more information on and examples of labels.
      "a_key": "A String",
    },
    "name": "A String", # The name of the session. This is always system-assigned; values provided
        # when creating a session are ignored.
    "approximateLastUseTime": "A String", # Output only. The approximate timestamp when the session is last used. It is
        # typically earlier than the actual last use time.
    "createTime": "A String", # Output only. The timestamp when the session is created.
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Ends a session, releasing server resources associated with it. This will
asynchronously trigger cancellation of any operations that are running with
this session.

Args:
  name: string, Required. The name of the session to delete. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="executeBatchDml">executeBatchDml(session, body, x__xgafv=None)</code>
  <pre>Executes a batch of SQL DML statements. This method allows many statements
to be run with lower latency than submitting them sequentially with
ExecuteSql.

Statements are executed in order, sequentially.
ExecuteBatchDmlResponse will contain a
ResultSet for each DML statement that has successfully executed. If a
statement fails, its error status will be returned as part of the
ExecuteBatchDmlResponse. Execution will
stop at the first failed statement; the remaining statements will not run.

ExecuteBatchDml is expected to return an OK status with a response even if
there was an error while processing one of the DML statements. Clients must
inspect response.status to determine if there were any errors while
processing the request.

See more details in
ExecuteBatchDmlRequest and
ExecuteBatchDmlResponse.

Args:
  session: string, Required. The session in which the DML statements should be performed. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for ExecuteBatchDml
    "seqno": "A String", # A per-transaction sequence number used to identify this request. This is
        # used in the same space as the seqno in
        # ExecuteSqlRequest. See more details
        # in ExecuteSqlRequest.
    "transaction": { # This message is used to select the transaction in which a # The transaction to use. A ReadWrite transaction is required. Single-use
        # transactions are not supported (to avoid replay).  The caller must either
        # supply an existing transaction ID or begin a new transaction.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "statements": [ # The list of statements to execute in this batch. Statements are executed
        # serially, such that the effects of statement i are visible to statement
        # i+1. Each statement must be a DML statement. Execution will stop at the
        # first failed statement; the remaining statements will not run.
        # 
        # REQUIRES: `statements_size()` > 0.
      { # A single DML statement.
        "paramTypes": { # It is not always possible for Cloud Spanner to infer the right SQL type
            # from a JSON value.  For example, values of type `BYTES` and values
            # of type `STRING` both appear in params as JSON strings.
            #
            # In these cases, `param_types` can be used to specify the exact
            # SQL type for some or all of the SQL statement parameters. See the
            # definition of Type for more information
            # about SQL types.
          "a_key": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a
              # table cell or returned from an SQL query.
            "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
                # provides type information for the struct's fields.
            "code": "A String", # Required. The TypeCode for this type.
            "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
                # is the type of the array elements.
          },
        },
        "params": { # The DML string can contain parameter placeholders. A parameter
            # placeholder consists of `'@'` followed by the parameter
            # name. Parameter names consist of any combination of letters,
            # numbers, and underscores.
            #
            # Parameters can appear anywhere that a literal value is expected.  The
            # same parameter name can be used more than once, for example:
            #   `"WHERE id > @msg_id AND id < @msg_id + 100"`
            #
            # It is an error to execute an SQL statement with unbound parameters.
            #
            # Parameter values are specified using `params`, which is a JSON
            # object whose keys are parameter names, and whose values are the
            # corresponding parameter values.
          "a_key": "", # Properties of the object.
        },
        "sql": "A String", # Required. The DML string.
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for ExecuteBatchDml. Contains a list
      # of ResultSet, one for each DML statement that has successfully executed.
      # If a statement fails, the error is returned as part of the response payload.
      # Clients can determine whether all DML statements have run successfully, or if
      # a statement failed, using one of the following approaches:
      #
      #   1. Check if `'status'` field is `OkStatus`.
      #   2. Check if `result_sets_size()` equals the number of statements in
      #      ExecuteBatchDmlRequest.
      #
      # Example 1: A request with 5 DML statements, all executed successfully.
      #
      # Result: A response with 5 ResultSets, one for each statement in the same
      # order, and an `OkStatus`.
      #
      # Example 2: A request with 5 DML statements. The 3rd statement has a syntax
      # error.
      #
      # Result: A response with 2 ResultSets, for the first 2 statements that
      # run successfully, and a syntax error (`INVALID_ARGUMENT`) status. From
      # `result_set_size()` client can determine that the 3rd statement has failed.
    "status": { # The `Status` type defines a logical error model that is suitable for # If all DML statements are executed successfully, status will be OK.
        # Otherwise, the error status of the first failed statement.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). The error model is designed to be:
        #
        # - Simple to use and understand for most users
        # - Flexible enough to meet unexpected needs
        #
        # # Overview
        #
        # The `Status` message contains three pieces of data: error code, error
        # message, and error details. The error code should be an enum value of
        # google.rpc.Code, but it may accept additional error codes if needed.  The
        # error message should be a developer-facing English message that helps
        # developers *understand* and *resolve* the error. If a localized user-facing
        # error message is needed, put the localized message in the error details or
        # localize it in the client. The optional error details may contain arbitrary
        # information about the error. There is a predefined set of error detail types
        # in the package `google.rpc` that can be used for common error conditions.
        #
        # # Language mapping
        #
        # The `Status` message is the logical representation of the error model, but it
        # is not necessarily the actual wire format. When the `Status` message is
        # exposed in different client libraries and different wire protocols, it can be
        # mapped differently. For example, it will likely be mapped to some exceptions
        # in Java, but more likely mapped to some error codes in C.
        #
        # # Other uses
        #
        # The error model and the `Status` message can be used in a variety of
        # environments, either with or without APIs, to provide a
        # consistent developer experience across different environments.
        #
        # Example uses of this error model include:
        #
        # - Partial errors. If a service needs to return partial errors to the client,
        #     it may embed the `Status` in the normal response to indicate the partial
        #     errors.
        #
        # - Workflow errors. A typical workflow has multiple steps. Each step may
        #     have a `Status` message for error reporting.
        #
        # - Batch operations. If a client uses batch request and batch response, the
        #     `Status` message should be used directly inside batch response, one for
        #     each error sub-response.
        #
        # - Asynchronous operations. If an API call embeds asynchronous operation
        #     results in its response, the status of those operations should be
        #     represented directly using the `Status` message.
        #
        # - Logging. If some API errors are stored in logs, the message `Status` could
        #     be used directly after any stripping needed for security/privacy reasons.
      "message": "A String", # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "resultSets": [ # ResultSets, one for each statement in the request that ran successfully, in
        # the same order as the statements in the request. Each ResultSet will
        # not contain any rows. The ResultSetStats in each ResultSet will
        # contain the number of rows modified by the statement.
        #
        # Only the first ResultSet in the response contains a valid
        # ResultSetMetadata.
      { # Results from Read or
          # ExecuteSql.
        "rows": [ # Each element in `rows` is a row whose format is defined by
            # metadata.row_type. The ith element
            # in each row matches the ith field in
            # metadata.row_type. Elements are
            # encoded based on type as described
            # here.
          [
            "",
          ],
        ],
        "stats": { # Additional statistics about a ResultSet or PartialResultSet. # Query plan and execution statistics for the SQL statement that
            # produced this result set. These can be requested by setting
            # ExecuteSqlRequest.query_mode.
            # DML statements always produce stats containing the number of rows
            # modified, unless executed using the
            # ExecuteSqlRequest.QueryMode.PLAN ExecuteSqlRequest.query_mode.
            # Other fields may or may not be populated, based on the
            # ExecuteSqlRequest.query_mode.
          "rowCountLowerBound": "A String", # Partitioned DML does not offer exactly-once semantics, so it
              # returns a lower bound of the rows modified.
          "rowCountExact": "A String", # Standard DML returns an exact count of rows that were modified.
          "queryPlan": { # Contains an ordered list of nodes appearing in the query plan. # QueryPlan for the query associated with this result.
            "planNodes": [ # The nodes in the query plan. Plan nodes are returned in pre-order starting
                # with the plan root. Each PlanNode's `id` corresponds to its index in
                # `plan_nodes`.
              { # Node information for nodes appearing in a QueryPlan.plan_nodes.
                "index": 42, # The `PlanNode`'s index in node list.
                "kind": "A String", # Used to determine the type of node. May be needed for visualizing
                    # different kinds of nodes differently. For example, If the node is a
                    # SCALAR node, it will have a condensed representation
                    # which can be used to directly embed a description of the node in its
                    # parent.
                "displayName": "A String", # The display name for the node.
                "executionStats": { # The execution statistics associated with the node, contained in a group of
                    # key-value pairs. Only present if the plan was returned as a result of a
                    # profile query. For example, number of executions, number of rows/time per
                    # execution etc.
                  "a_key": "", # Properties of the object.
                },
                "childLinks": [ # List of child node `index`es and their relationship to this parent.
                  { # Metadata associated with a parent-child relationship appearing in a
                      # PlanNode.
                    "variable": "A String", # Only present if the child node is SCALAR and corresponds
                        # to an output variable of the parent node. The field carries the name of
                        # the output variable.
                        # For example, a `TableScan` operator that reads rows from a table will
                        # have child links to the `SCALAR` nodes representing the output variables
                        # created for each column that is read by the operator. The corresponding
                        # `variable` fields will be set to the variable names assigned to the
                        # columns.
                    "childIndex": 42, # The node to which the link points.
                    "type": "A String", # The type of the link. For example, in Hash Joins this could be used to
                        # distinguish between the build child and the probe child, or in the case
                        # of the child being an output variable, to represent the tag associated
                        # with the output variable.
                  },
                ],
                "shortRepresentation": { # Condensed representation of a node and its subtree. Only present for # Condensed representation for SCALAR nodes.
                    # `SCALAR` PlanNode(s).
                  "subqueries": { # A mapping of (subquery variable name) -> (subquery node id) for cases
                      # where the `description` string of this node references a `SCALAR`
                      # subquery contained in the expression subtree rooted at this node. The
                      # referenced `SCALAR` subquery may not necessarily be a direct child of
                      # this node.
                    "a_key": 42,
                  },
                  "description": "A String", # A string representation of the expression subtree rooted at this node.
                },
                "metadata": { # Attributes relevant to the node contained in a group of key-value pairs.
                    # For example, a Parameter Reference node could have the following
                    # information in its metadata:
                    #
                    #     {
                    #       "parameter_reference": "param1",
                    #       "parameter_type": "array"
                    #     }
                  "a_key": "", # Properties of the object.
                },
              },
            ],
          },
          "queryStats": { # Aggregated statistics from the execution of the query. Only present when
              # the query is profiled. For example, a query could return the statistics as
              # follows:
              #
              #     {
              #       "rows_returned": "3",
              #       "elapsed_time": "1.22 secs",
              #       "cpu_time": "1.19 secs"
              #     }
            "a_key": "", # Properties of the object.
          },
        },
        "metadata": { # Metadata about a ResultSet or PartialResultSet. # Metadata about the result set, such as row type information.
          "rowType": { # `StructType` defines the fields of a STRUCT type. # Indicates the field names and types for the rows in the result
              # set.  For example, a SQL query like `"SELECT UserId, UserName FROM
              # Users"` could return a `row_type` value like:
              #
              #     "fields": [
              #       { "name": "UserId", "type": { "code": "INT64" } },
              #       { "name": "UserName", "type": { "code": "STRING" } },
              #     ]
            "fields": [ # The list of fields that make up this struct. Order is
                # significant, because values of this struct type are represented as
                # lists, where the order of field values matches the order of
                # fields in the StructType. In turn, the order of fields
                # matches the order of columns in a read request, or the order of
                # fields in the `SELECT` clause of a query.
              { # Message representing a single field of a struct.
                "type": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a # The type of the field.
                    # table cell or returned from an SQL query.
                  "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
                      # provides type information for the struct's fields.
                  "code": "A String", # Required. The TypeCode for this type.
                  "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
                      # is the type of the array elements.
                },
                "name": "A String", # The name of the field. For reads, this is the column name. For
                    # SQL queries, it is the column alias (e.g., `"Word"` in the
                    # query `"SELECT 'hello' AS Word"`), or the column name (e.g.,
                    # `"ColName"` in the query `"SELECT ColName FROM Table"`). Some
                    # columns might have an empty name (e.g., !"SELECT
                    # UPPER(ColName)"`). Note that a query result can contain
                    # multiple fields with the same name.
              },
            ],
          },
          "transaction": { # A transaction. # If the read or SQL query began a transaction as a side-effect, the
              # information about the new transaction is yielded here.
            "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
                # for the transaction. Not returned by default: see
                # TransactionOptions.ReadOnly.return_read_timestamp.
                #
                # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
                # Example: `"2014-10-02T15:01:23.045123456Z"`.
            "id": "A String", # `id` may be used to identify the transaction in subsequent
                # Read,
                # ExecuteSql,
                # Commit, or
                # Rollback calls.
                #
                # Single-use read-only transactions do not have IDs, because
                # single-use transactions do not support multiple requests.
          },
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="executeSql">executeSql(session, body, x__xgafv=None)</code>
  <pre>Executes an SQL statement, returning all results in a single reply. This
method cannot be used to return a result set larger than 10 MiB;
if the query yields more data than that, the query fails with
a `FAILED_PRECONDITION` error.

Operations inside read-write transactions might return `ABORTED`. If
this occurs, the application should restart the transaction from
the beginning. See Transaction for more details.

Larger result sets can be fetched in streaming fashion by calling
ExecuteStreamingSql instead.

Args:
  session: string, Required. The session in which the SQL query should be performed. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for ExecuteSql and
      # ExecuteStreamingSql.
    "transaction": { # This message is used to select the transaction in which a # The transaction to use. If none is provided, the default is a
        # temporary read-only transaction with strong concurrency.
        # 
        # The transaction to use.
        # 
        # For queries, if none is provided, the default is a temporary read-only
        # transaction with strong concurrency.
        # 
        # Standard DML statements require a ReadWrite transaction. Single-use
        # transactions are not supported (to avoid replay).  The caller must
        # either supply an existing transaction ID or begin a new transaction.
        # 
        # Partitioned DML requires an existing PartitionedDml transaction ID.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "seqno": "A String", # A per-transaction sequence number used to identify this request. This
        # makes each request idempotent such that if the request is received multiple
        # times, at most one will succeed.
        # 
        # The sequence number must be monotonically increasing within the
        # transaction. If a request arrives for the first time with an out-of-order
        # sequence number, the transaction may be aborted. Replays of previously
        # handled requests will yield the same response as the first execution.
        # 
        # Required for DML statements. Ignored for queries.
    "resumeToken": "A String", # If this request is resuming a previously interrupted SQL statement
        # execution, `resume_token` should be copied from the last
        # PartialResultSet yielded before the interruption. Doing this
        # enables the new SQL statement execution to resume where the last one left
        # off. The rest of the request parameters must exactly match the
        # request that yielded this token.
    "partitionToken": "A String", # If present, results will be restricted to the specified partition
        # previously created using PartitionQuery().  There must be an exact
        # match for the values of fields common to this message and the
        # PartitionQueryRequest message used to create this partition_token.
    "paramTypes": { # It is not always possible for Cloud Spanner to infer the right SQL type
        # from a JSON value.  For example, values of type `BYTES` and values
        # of type `STRING` both appear in params as JSON strings.
        # 
        # In these cases, `param_types` can be used to specify the exact
        # SQL type for some or all of the SQL statement parameters. See the
        # definition of Type for more information
        # about SQL types.
      "a_key": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a
          # table cell or returned from an SQL query.
        "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
            # provides type information for the struct's fields.
        "code": "A String", # Required. The TypeCode for this type.
        "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
            # is the type of the array elements.
      },
    },
    "queryMode": "A String", # Used to control the amount of debugging information returned in
        # ResultSetStats. If partition_token is set, query_mode can only
        # be set to QueryMode.NORMAL.
    "sql": "A String", # Required. The SQL string.
    "params": { # The SQL string can contain parameter placeholders. A parameter
        # placeholder consists of `'@'` followed by the parameter
        # name. Parameter names consist of any combination of letters,
        # numbers, and underscores.
        # 
        # Parameters can appear anywhere that a literal value is expected.  The same
        # parameter name can be used more than once, for example:
        #   `"WHERE id > @msg_id AND id < @msg_id + 100"`
        # 
        # It is an error to execute an SQL statement with unbound parameters.
        # 
        # Parameter values are specified using `params`, which is a JSON
        # object whose keys are parameter names, and whose values are the
        # corresponding parameter values.
      "a_key": "", # Properties of the object.
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Results from Read or
      # ExecuteSql.
    "rows": [ # Each element in `rows` is a row whose format is defined by
        # metadata.row_type. The ith element
        # in each row matches the ith field in
        # metadata.row_type. Elements are
        # encoded based on type as described
        # here.
      [
        "",
      ],
    ],
    "stats": { # Additional statistics about a ResultSet or PartialResultSet. # Query plan and execution statistics for the SQL statement that
        # produced this result set. These can be requested by setting
        # ExecuteSqlRequest.query_mode.
        # DML statements always produce stats containing the number of rows
        # modified, unless executed using the
        # ExecuteSqlRequest.QueryMode.PLAN ExecuteSqlRequest.query_mode.
        # Other fields may or may not be populated, based on the
        # ExecuteSqlRequest.query_mode.
      "rowCountLowerBound": "A String", # Partitioned DML does not offer exactly-once semantics, so it
          # returns a lower bound of the rows modified.
      "rowCountExact": "A String", # Standard DML returns an exact count of rows that were modified.
      "queryPlan": { # Contains an ordered list of nodes appearing in the query plan. # QueryPlan for the query associated with this result.
        "planNodes": [ # The nodes in the query plan. Plan nodes are returned in pre-order starting
            # with the plan root. Each PlanNode's `id` corresponds to its index in
            # `plan_nodes`.
          { # Node information for nodes appearing in a QueryPlan.plan_nodes.
            "index": 42, # The `PlanNode`'s index in node list.
            "kind": "A String", # Used to determine the type of node. May be needed for visualizing
                # different kinds of nodes differently. For example, If the node is a
                # SCALAR node, it will have a condensed representation
                # which can be used to directly embed a description of the node in its
                # parent.
            "displayName": "A String", # The display name for the node.
            "executionStats": { # The execution statistics associated with the node, contained in a group of
                # key-value pairs. Only present if the plan was returned as a result of a
                # profile query. For example, number of executions, number of rows/time per
                # execution etc.
              "a_key": "", # Properties of the object.
            },
            "childLinks": [ # List of child node `index`es and their relationship to this parent.
              { # Metadata associated with a parent-child relationship appearing in a
                  # PlanNode.
                "variable": "A String", # Only present if the child node is SCALAR and corresponds
                    # to an output variable of the parent node. The field carries the name of
                    # the output variable.
                    # For example, a `TableScan` operator that reads rows from a table will
                    # have child links to the `SCALAR` nodes representing the output variables
                    # created for each column that is read by the operator. The corresponding
                    # `variable` fields will be set to the variable names assigned to the
                    # columns.
                "childIndex": 42, # The node to which the link points.
                "type": "A String", # The type of the link. For example, in Hash Joins this could be used to
                    # distinguish between the build child and the probe child, or in the case
                    # of the child being an output variable, to represent the tag associated
                    # with the output variable.
              },
            ],
            "shortRepresentation": { # Condensed representation of a node and its subtree. Only present for # Condensed representation for SCALAR nodes.
                # `SCALAR` PlanNode(s).
              "subqueries": { # A mapping of (subquery variable name) -> (subquery node id) for cases
                  # where the `description` string of this node references a `SCALAR`
                  # subquery contained in the expression subtree rooted at this node. The
                  # referenced `SCALAR` subquery may not necessarily be a direct child of
                  # this node.
                "a_key": 42,
              },
              "description": "A String", # A string representation of the expression subtree rooted at this node.
            },
            "metadata": { # Attributes relevant to the node contained in a group of key-value pairs.
                # For example, a Parameter Reference node could have the following
                # information in its metadata:
                #
                #     {
                #       "parameter_reference": "param1",
                #       "parameter_type": "array"
                #     }
              "a_key": "", # Properties of the object.
            },
          },
        ],
      },
      "queryStats": { # Aggregated statistics from the execution of the query. Only present when
          # the query is profiled. For example, a query could return the statistics as
          # follows:
          #
          #     {
          #       "rows_returned": "3",
          #       "elapsed_time": "1.22 secs",
          #       "cpu_time": "1.19 secs"
          #     }
        "a_key": "", # Properties of the object.
      },
    },
    "metadata": { # Metadata about a ResultSet or PartialResultSet. # Metadata about the result set, such as row type information.
      "rowType": { # `StructType` defines the fields of a STRUCT type. # Indicates the field names and types for the rows in the result
          # set.  For example, a SQL query like `"SELECT UserId, UserName FROM
          # Users"` could return a `row_type` value like:
          #
          #     "fields": [
          #       { "name": "UserId", "type": { "code": "INT64" } },
          #       { "name": "UserName", "type": { "code": "STRING" } },
          #     ]
        "fields": [ # The list of fields that make up this struct. Order is
            # significant, because values of this struct type are represented as
            # lists, where the order of field values matches the order of
            # fields in the StructType. In turn, the order of fields
            # matches the order of columns in a read request, or the order of
            # fields in the `SELECT` clause of a query.
          { # Message representing a single field of a struct.
            "type": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a # The type of the field.
                # table cell or returned from an SQL query.
              "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
                  # provides type information for the struct's fields.
              "code": "A String", # Required. The TypeCode for this type.
              "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
                  # is the type of the array elements.
            },
            "name": "A String", # The name of the field. For reads, this is the column name. For
                # SQL queries, it is the column alias (e.g., `"Word"` in the
                # query `"SELECT 'hello' AS Word"`), or the column name (e.g.,
                # `"ColName"` in the query `"SELECT ColName FROM Table"`). Some
                # columns might have an empty name (e.g., !"SELECT
                # UPPER(ColName)"`). Note that a query result can contain
                # multiple fields with the same name.
          },
        ],
      },
      "transaction": { # A transaction. # If the read or SQL query began a transaction as a side-effect, the
          # information about the new transaction is yielded here.
        "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
            # for the transaction. Not returned by default: see
            # TransactionOptions.ReadOnly.return_read_timestamp.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "id": "A String", # `id` may be used to identify the transaction in subsequent
            # Read,
            # ExecuteSql,
            # Commit, or
            # Rollback calls.
            #
            # Single-use read-only transactions do not have IDs, because
            # single-use transactions do not support multiple requests.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="executeStreamingSql">executeStreamingSql(session, body, x__xgafv=None)</code>
  <pre>Like ExecuteSql, except returns the result
set as a stream. Unlike ExecuteSql, there
is no limit on the size of the returned result set. However, no
individual row in the result set can exceed 100 MiB, and no
column value can exceed 10 MiB.

Args:
  session: string, Required. The session in which the SQL query should be performed. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for ExecuteSql and
      # ExecuteStreamingSql.
    "transaction": { # This message is used to select the transaction in which a # The transaction to use. If none is provided, the default is a
        # temporary read-only transaction with strong concurrency.
        # 
        # The transaction to use.
        # 
        # For queries, if none is provided, the default is a temporary read-only
        # transaction with strong concurrency.
        # 
        # Standard DML statements require a ReadWrite transaction. Single-use
        # transactions are not supported (to avoid replay).  The caller must
        # either supply an existing transaction ID or begin a new transaction.
        # 
        # Partitioned DML requires an existing PartitionedDml transaction ID.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "seqno": "A String", # A per-transaction sequence number used to identify this request. This
        # makes each request idempotent such that if the request is received multiple
        # times, at most one will succeed.
        # 
        # The sequence number must be monotonically increasing within the
        # transaction. If a request arrives for the first time with an out-of-order
        # sequence number, the transaction may be aborted. Replays of previously
        # handled requests will yield the same response as the first execution.
        # 
        # Required for DML statements. Ignored for queries.
    "resumeToken": "A String", # If this request is resuming a previously interrupted SQL statement
        # execution, `resume_token` should be copied from the last
        # PartialResultSet yielded before the interruption. Doing this
        # enables the new SQL statement execution to resume where the last one left
        # off. The rest of the request parameters must exactly match the
        # request that yielded this token.
    "partitionToken": "A String", # If present, results will be restricted to the specified partition
        # previously created using PartitionQuery().  There must be an exact
        # match for the values of fields common to this message and the
        # PartitionQueryRequest message used to create this partition_token.
    "paramTypes": { # It is not always possible for Cloud Spanner to infer the right SQL type
        # from a JSON value.  For example, values of type `BYTES` and values
        # of type `STRING` both appear in params as JSON strings.
        # 
        # In these cases, `param_types` can be used to specify the exact
        # SQL type for some or all of the SQL statement parameters. See the
        # definition of Type for more information
        # about SQL types.
      "a_key": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a
          # table cell or returned from an SQL query.
        "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
            # provides type information for the struct's fields.
        "code": "A String", # Required. The TypeCode for this type.
        "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
            # is the type of the array elements.
      },
    },
    "queryMode": "A String", # Used to control the amount of debugging information returned in
        # ResultSetStats. If partition_token is set, query_mode can only
        # be set to QueryMode.NORMAL.
    "sql": "A String", # Required. The SQL string.
    "params": { # The SQL string can contain parameter placeholders. A parameter
        # placeholder consists of `'@'` followed by the parameter
        # name. Parameter names consist of any combination of letters,
        # numbers, and underscores.
        # 
        # Parameters can appear anywhere that a literal value is expected.  The same
        # parameter name can be used more than once, for example:
        #   `"WHERE id > @msg_id AND id < @msg_id + 100"`
        # 
        # It is an error to execute an SQL statement with unbound parameters.
        # 
        # Parameter values are specified using `params`, which is a JSON
        # object whose keys are parameter names, and whose values are the
        # corresponding parameter values.
      "a_key": "", # Properties of the object.
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Partial results from a streaming read or SQL query. Streaming reads and
      # SQL queries better tolerate large result sets, large rows, and large
      # values, but are a little trickier to consume.
    "resumeToken": "A String", # Streaming calls might be interrupted for a variety of reasons, such
        # as TCP connection loss. If this occurs, the stream of results can
        # be resumed by re-sending the original request and including
        # `resume_token`. Note that executing any other transaction in the
        # same session invalidates the token.
    "chunkedValue": True or False, # If true, then the final value in values is chunked, and must
        # be combined with more values from subsequent `PartialResultSet`s
        # to obtain a complete field value.
    "values": [ # A streamed result set consists of a stream of values, which might
        # be split into many `PartialResultSet` messages to accommodate
        # large rows and/or large values. Every N complete values defines a
        # row, where N is equal to the number of entries in
        # metadata.row_type.fields.
        #
        # Most values are encoded based on type as described
        # here.
        #
        # It is possible that the last value in values is "chunked",
        # meaning that the rest of the value is sent in subsequent
        # `PartialResultSet`(s). This is denoted by the chunked_value
        # field. Two or more chunked values can be merged to form a
        # complete value as follows:
        #
        #   * `bool/number/null`: cannot be chunked
        #   * `string`: concatenate the strings
        #   * `list`: concatenate the lists. If the last element in a list is a
        #     `string`, `list`, or `object`, merge it with the first element in
        #     the next list by applying these rules recursively.
        #   * `object`: concatenate the (field name, field value) pairs. If a
        #     field name is duplicated, then apply these rules recursively
        #     to merge the field values.
        #
        # Some examples of merging:
        #
        #     # Strings are concatenated.
        #     "foo", "bar" => "foobar"
        #
        #     # Lists of non-strings are concatenated.
        #     [2, 3], [4] => [2, 3, 4]
        #
        #     # Lists are concatenated, but the last and first elements are merged
        #     # because they are strings.
        #     ["a", "b"], ["c", "d"] => ["a", "bc", "d"]
        #
        #     # Lists are concatenated, but the last and first elements are merged
        #     # because they are lists. Recursively, the last and first elements
        #     # of the inner lists are merged because they are strings.
        #     ["a", ["b", "c"]], [["d"], "e"] => ["a", ["b", "cd"], "e"]
        #
        #     # Non-overlapping object fields are combined.
        #     {"a": "1"}, {"b": "2"} => {"a": "1", "b": 2"}
        #
        #     # Overlapping object fields are merged.
        #     {"a": "1"}, {"a": "2"} => {"a": "12"}
        #
        #     # Examples of merging objects containing lists of strings.
        #     {"a": ["1"]}, {"a": ["2"]} => {"a": ["12"]}
        #
        # For a more complete example, suppose a streaming SQL query is
        # yielding a result set whose rows contain a single string
        # field. The following `PartialResultSet`s might be yielded:
        #
        #     {
        #       "metadata": { ... }
        #       "values": ["Hello", "W"]
        #       "chunked_value": true
        #       "resume_token": "Af65..."
        #     }
        #     {
        #       "values": ["orl"]
        #       "chunked_value": true
        #       "resume_token": "Bqp2..."
        #     }
        #     {
        #       "values": ["d"]
        #       "resume_token": "Zx1B..."
        #     }
        #
        # This sequence of `PartialResultSet`s encodes two rows, one
        # containing the field value `"Hello"`, and a second containing the
        # field value `"World" = "W" + "orl" + "d"`.
      "",
    ],
    "stats": { # Additional statistics about a ResultSet or PartialResultSet. # Query plan and execution statistics for the statement that produced this
        # streaming result set. These can be requested by setting
        # ExecuteSqlRequest.query_mode and are sent
        # only once with the last response in the stream.
        # This field will also be present in the last response for DML
        # statements.
      "rowCountLowerBound": "A String", # Partitioned DML does not offer exactly-once semantics, so it
          # returns a lower bound of the rows modified.
      "rowCountExact": "A String", # Standard DML returns an exact count of rows that were modified.
      "queryPlan": { # Contains an ordered list of nodes appearing in the query plan. # QueryPlan for the query associated with this result.
        "planNodes": [ # The nodes in the query plan. Plan nodes are returned in pre-order starting
            # with the plan root. Each PlanNode's `id` corresponds to its index in
            # `plan_nodes`.
          { # Node information for nodes appearing in a QueryPlan.plan_nodes.
            "index": 42, # The `PlanNode`'s index in node list.
            "kind": "A String", # Used to determine the type of node. May be needed for visualizing
                # different kinds of nodes differently. For example, If the node is a
                # SCALAR node, it will have a condensed representation
                # which can be used to directly embed a description of the node in its
                # parent.
            "displayName": "A String", # The display name for the node.
            "executionStats": { # The execution statistics associated with the node, contained in a group of
                # key-value pairs. Only present if the plan was returned as a result of a
                # profile query. For example, number of executions, number of rows/time per
                # execution etc.
              "a_key": "", # Properties of the object.
            },
            "childLinks": [ # List of child node `index`es and their relationship to this parent.
              { # Metadata associated with a parent-child relationship appearing in a
                  # PlanNode.
                "variable": "A String", # Only present if the child node is SCALAR and corresponds
                    # to an output variable of the parent node. The field carries the name of
                    # the output variable.
                    # For example, a `TableScan` operator that reads rows from a table will
                    # have child links to the `SCALAR` nodes representing the output variables
                    # created for each column that is read by the operator. The corresponding
                    # `variable` fields will be set to the variable names assigned to the
                    # columns.
                "childIndex": 42, # The node to which the link points.
                "type": "A String", # The type of the link. For example, in Hash Joins this could be used to
                    # distinguish between the build child and the probe child, or in the case
                    # of the child being an output variable, to represent the tag associated
                    # with the output variable.
              },
            ],
            "shortRepresentation": { # Condensed representation of a node and its subtree. Only present for # Condensed representation for SCALAR nodes.
                # `SCALAR` PlanNode(s).
              "subqueries": { # A mapping of (subquery variable name) -> (subquery node id) for cases
                  # where the `description` string of this node references a `SCALAR`
                  # subquery contained in the expression subtree rooted at this node. The
                  # referenced `SCALAR` subquery may not necessarily be a direct child of
                  # this node.
                "a_key": 42,
              },
              "description": "A String", # A string representation of the expression subtree rooted at this node.
            },
            "metadata": { # Attributes relevant to the node contained in a group of key-value pairs.
                # For example, a Parameter Reference node could have the following
                # information in its metadata:
                #
                #     {
                #       "parameter_reference": "param1",
                #       "parameter_type": "array"
                #     }
              "a_key": "", # Properties of the object.
            },
          },
        ],
      },
      "queryStats": { # Aggregated statistics from the execution of the query. Only present when
          # the query is profiled. For example, a query could return the statistics as
          # follows:
          #
          #     {
          #       "rows_returned": "3",
          #       "elapsed_time": "1.22 secs",
          #       "cpu_time": "1.19 secs"
          #     }
        "a_key": "", # Properties of the object.
      },
    },
    "metadata": { # Metadata about a ResultSet or PartialResultSet. # Metadata about the result set, such as row type information.
        # Only present in the first response.
      "rowType": { # `StructType` defines the fields of a STRUCT type. # Indicates the field names and types for the rows in the result
          # set.  For example, a SQL query like `"SELECT UserId, UserName FROM
          # Users"` could return a `row_type` value like:
          #
          #     "fields": [
          #       { "name": "UserId", "type": { "code": "INT64" } },
          #       { "name": "UserName", "type": { "code": "STRING" } },
          #     ]
        "fields": [ # The list of fields that make up this struct. Order is
            # significant, because values of this struct type are represented as
            # lists, where the order of field values matches the order of
            # fields in the StructType. In turn, the order of fields
            # matches the order of columns in a read request, or the order of
            # fields in the `SELECT` clause of a query.
          { # Message representing a single field of a struct.
            "type": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a # The type of the field.
                # table cell or returned from an SQL query.
              "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
                  # provides type information for the struct's fields.
              "code": "A String", # Required. The TypeCode for this type.
              "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
                  # is the type of the array elements.
            },
            "name": "A String", # The name of the field. For reads, this is the column name. For
                # SQL queries, it is the column alias (e.g., `"Word"` in the
                # query `"SELECT 'hello' AS Word"`), or the column name (e.g.,
                # `"ColName"` in the query `"SELECT ColName FROM Table"`). Some
                # columns might have an empty name (e.g., !"SELECT
                # UPPER(ColName)"`). Note that a query result can contain
                # multiple fields with the same name.
          },
        ],
      },
      "transaction": { # A transaction. # If the read or SQL query began a transaction as a side-effect, the
          # information about the new transaction is yielded here.
        "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
            # for the transaction. Not returned by default: see
            # TransactionOptions.ReadOnly.return_read_timestamp.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "id": "A String", # `id` may be used to identify the transaction in subsequent
            # Read,
            # ExecuteSql,
            # Commit, or
            # Rollback calls.
            #
            # Single-use read-only transactions do not have IDs, because
            # single-use transactions do not support multiple requests.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Gets a session. Returns `NOT_FOUND` if the session does not exist.
This is mainly useful for determining whether a session is still
alive.

Args:
  name: string, Required. The name of the session to retrieve. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A session in the Cloud Spanner API.
    "labels": { # The labels for the session.
        #
        #  * Label keys must be between 1 and 63 characters long and must conform to
        #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
        #  * Label values must be between 0 and 63 characters long and must conform
        #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
        #  * No more than 64 labels can be associated with a given session.
        #
        # See https://goo.gl/xmQnxf for more information on and examples of labels.
      "a_key": "A String",
    },
    "name": "A String", # The name of the session. This is always system-assigned; values provided
        # when creating a session are ignored.
    "approximateLastUseTime": "A String", # Output only. The approximate timestamp when the session is last used. It is
        # typically earlier than the actual last use time.
    "createTime": "A String", # Output only. The timestamp when the session is created.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(database, pageSize=None, filter=None, pageToken=None, x__xgafv=None)</code>
  <pre>Lists all sessions in a given database.

Args:
  database: string, Required. The database in which to list sessions. (required)
  pageSize: integer, Number of sessions to be returned in the response. If 0 or less, defaults
to the server's maximum allowed page size.
  filter: string, An expression for filtering the results of the request. Filter rules are
case insensitive. The fields eligible for filtering are:

  * `labels.key` where key is the name of a label

Some examples of using filters are:

  * `labels.env:*` --> The session has the label "env".
  * `labels.env:dev` --> The session has the label "env" and the value of
                       the label contains the string "dev".
  pageToken: string, If non-empty, `page_token` should contain a
next_page_token from a previous
ListSessionsResponse.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for ListSessions.
    "nextPageToken": "A String", # `next_page_token` can be sent in a subsequent
        # ListSessions call to fetch more of the matching
        # sessions.
    "sessions": [ # The list of requested sessions.
      { # A session in the Cloud Spanner API.
        "labels": { # The labels for the session.
            #
            #  * Label keys must be between 1 and 63 characters long and must conform to
            #    the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
            #  * Label values must be between 0 and 63 characters long and must conform
            #    to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
            #  * No more than 64 labels can be associated with a given session.
            #
            # See https://goo.gl/xmQnxf for more information on and examples of labels.
          "a_key": "A String",
        },
        "name": "A String", # The name of the session. This is always system-assigned; values provided
            # when creating a session are ignored.
        "approximateLastUseTime": "A String", # Output only. The approximate timestamp when the session is last used. It is
            # typically earlier than the actual last use time.
        "createTime": "A String", # Output only. The timestamp when the session is created.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call 'execute()' on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

<div class="method">
    <code class="details" id="partitionQuery">partitionQuery(session, body, x__xgafv=None)</code>
  <pre>Creates a set of partition tokens that can be used to execute a query
operation in parallel.  Each of the returned partition tokens can be used
by ExecuteStreamingSql to specify a subset
of the query result to read.  The same session and read-only transaction
must be used by the PartitionQueryRequest used to create the
partition tokens and the ExecuteSqlRequests that use the partition tokens.

Partition tokens become invalid when the session used to create them
is deleted, is idle for too long, begins a new transaction, or becomes too
old.  When any of these happen, it is not possible to resume the query, and
the whole operation must be restarted from the beginning.

Args:
  session: string, Required. The session used to create the partitions. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for PartitionQuery
    "paramTypes": { # It is not always possible for Cloud Spanner to infer the right SQL type
        # from a JSON value.  For example, values of type `BYTES` and values
        # of type `STRING` both appear in params as JSON strings.
        # 
        # In these cases, `param_types` can be used to specify the exact
        # SQL type for some or all of the SQL query parameters. See the
        # definition of Type for more information
        # about SQL types.
      "a_key": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a
          # table cell or returned from an SQL query.
        "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
            # provides type information for the struct's fields.
        "code": "A String", # Required. The TypeCode for this type.
        "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
            # is the type of the array elements.
      },
    },
    "partitionOptions": { # Options for a PartitionQueryRequest and # Additional options that affect how many partitions are created.
        # PartitionReadRequest.
      "maxPartitions": "A String", # **Note:** This hint is currently ignored by PartitionQuery and
          # PartitionRead requests.
          #
          # The desired maximum number of partitions to return.  For example, this may
          # be set to the number of workers available.  The default for this option
          # is currently 10,000. The maximum value is currently 200,000.  This is only
          # a hint.  The actual number of partitions returned may be smaller or larger
          # than this maximum count request.
      "partitionSizeBytes": "A String", # **Note:** This hint is currently ignored by PartitionQuery and
          # PartitionRead requests.
          #
          # The desired data size for each partition generated.  The default for this
          # option is currently 1 GiB.  This is only a hint. The actual size of each
          # partition may be smaller or larger than this size request.
    },
    "transaction": { # This message is used to select the transaction in which a # Read only snapshot transactions are supported, read/write and single use
        # transactions are not.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "params": { # The SQL query string can contain parameter placeholders. A parameter
        # placeholder consists of `'@'` followed by the parameter
        # name. Parameter names consist of any combination of letters,
        # numbers, and underscores.
        # 
        # Parameters can appear anywhere that a literal value is expected.  The same
        # parameter name can be used more than once, for example:
        #   `"WHERE id > @msg_id AND id < @msg_id + 100"`
        # 
        # It is an error to execute an SQL query with unbound parameters.
        # 
        # Parameter values are specified using `params`, which is a JSON
        # object whose keys are parameter names, and whose values are the
        # corresponding parameter values.
      "a_key": "", # Properties of the object.
    },
    "sql": "A String", # The query request to generate partitions for. The request will fail if
        # the query is not root partitionable. The query plan of a root
        # partitionable query has a single distributed union operator. A distributed
        # union operator conceptually divides one or more tables into multiple
        # splits, remotely evaluates a subquery independently on each split, and
        # then unions all results.
        # 
        # This must not contain DML commands, such as INSERT, UPDATE, or
        # DELETE. Use ExecuteStreamingSql with a
        # PartitionedDml transaction for large, partition-friendly DML operations.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for PartitionQuery
      # or PartitionRead
    "transaction": { # A transaction. # Transaction created by this request.
      "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
          # for the transaction. Not returned by default: see
          # TransactionOptions.ReadOnly.return_read_timestamp.
          #
          # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
          # Example: `"2014-10-02T15:01:23.045123456Z"`.
      "id": "A String", # `id` may be used to identify the transaction in subsequent
          # Read,
          # ExecuteSql,
          # Commit, or
          # Rollback calls.
          #
          # Single-use read-only transactions do not have IDs, because
          # single-use transactions do not support multiple requests.
    },
    "partitions": [ # Partitions created by this request.
      { # Information returned for each partition returned in a
          # PartitionResponse.
        "partitionToken": "A String", # This token can be passed to Read, StreamingRead, ExecuteSql, or
            # ExecuteStreamingSql requests to restrict the results to those identified by
            # this partition token.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="partitionRead">partitionRead(session, body, x__xgafv=None)</code>
  <pre>Creates a set of partition tokens that can be used to execute a read
operation in parallel.  Each of the returned partition tokens can be used
by StreamingRead to specify a subset of the read
result to read.  The same session and read-only transaction must be used by
the PartitionReadRequest used to create the partition tokens and the
ReadRequests that use the partition tokens.  There are no ordering
guarantees on rows returned among the returned partition tokens, or even
within each individual StreamingRead call issued with a partition_token.

Partition tokens become invalid when the session used to create them
is deleted, is idle for too long, begins a new transaction, or becomes too
old.  When any of these happen, it is not possible to resume the read, and
the whole operation must be restarted from the beginning.

Args:
  session: string, Required. The session used to create the partitions. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for PartitionRead
    "index": "A String", # If non-empty, the name of an index on table. This index is
        # used instead of the table primary key when interpreting key_set
        # and sorting result rows. See key_set for further information.
    "transaction": { # This message is used to select the transaction in which a # Read only snapshot transactions are supported, read/write and single use
        # transactions are not.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "keySet": { # `KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All # Required. `key_set` identifies the rows to be yielded. `key_set` names the
        # primary keys of the rows in table to be yielded, unless index
        # is present. If index is present, then key_set instead names
        # index keys in index.
        # 
        # It is not an error for the `key_set` to name rows that do not
        # exist in the database. Read yields nothing for nonexistent rows.
        # the keys are expected to be in the same table or index. The keys need
        # not be sorted in any particular way.
        #
        # If the same key is specified multiple times in the set (for example
        # if two ranges, two keys, or a key and a range overlap), Cloud Spanner
        # behaves as if the key were only specified once.
      "ranges": [ # A list of key ranges. See KeyRange for more information about
          # key range specifications.
        { # KeyRange represents a range of rows in a table or index.
            #
            # A range has a start key and an end key. These keys can be open or
            # closed, indicating if the range includes rows with that key.
            #
            # Keys are represented by lists, where the ith value in the list
            # corresponds to the ith component of the table or index primary key.
            # Individual values are encoded as described
            # here.
            #
            # For example, consider the following table definition:
            #
            #     CREATE TABLE UserEvents (
            #       UserName STRING(MAX),
            #       EventDate STRING(10)
            #     ) PRIMARY KEY(UserName, EventDate);
            #
            # The following keys name rows in this table:
            #
            #     "Bob", "2014-09-23"
            #
            # Since the `UserEvents` table's `PRIMARY KEY` clause names two
            # columns, each `UserEvents` key has two elements; the first is the
            # `UserName`, and the second is the `EventDate`.
            #
            # Key ranges with multiple components are interpreted
            # lexicographically by component using the table or index key's declared
            # sort order. For example, the following range returns all events for
            # user `"Bob"` that occurred in the year 2015:
            #
            #     "start_closed": ["Bob", "2015-01-01"]
            #     "end_closed": ["Bob", "2015-12-31"]
            #
            # Start and end keys can omit trailing key components. This affects the
            # inclusion and exclusion of rows that exactly match the provided key
            # components: if the key is closed, then rows that exactly match the
            # provided components are included; if the key is open, then rows
            # that exactly match are not included.
            #
            # For example, the following range includes all events for `"Bob"` that
            # occurred during and after the year 2000:
            #
            #     "start_closed": ["Bob", "2000-01-01"]
            #     "end_closed": ["Bob"]
            #
            # The next example retrieves all events for `"Bob"`:
            #
            #     "start_closed": ["Bob"]
            #     "end_closed": ["Bob"]
            #
            # To retrieve events before the year 2000:
            #
            #     "start_closed": ["Bob"]
            #     "end_open": ["Bob", "2000-01-01"]
            #
            # The following range includes all rows in the table:
            #
            #     "start_closed": []
            #     "end_closed": []
            #
            # This range returns all users whose `UserName` begins with any
            # character from A to C:
            #
            #     "start_closed": ["A"]
            #     "end_open": ["D"]
            #
            # This range returns all users whose `UserName` begins with B:
            #
            #     "start_closed": ["B"]
            #     "end_open": ["C"]
            #
            # Key ranges honor column sort order. For example, suppose a table is
            # defined as follows:
            #
            #     CREATE TABLE DescendingSortedTable {
            #       Key INT64,
            #       ...
            #     ) PRIMARY KEY(Key DESC);
            #
            # The following range retrieves all rows with key values between 1
            # and 100 inclusive:
            #
            #     "start_closed": ["100"]
            #     "end_closed": ["1"]
            #
            # Note that 100 is passed as the start, and 1 is passed as the end,
            # because `Key` is a descending column in the schema.
          "endOpen": [ # If the end is open, then the range excludes rows whose first
              # `len(end_open)` key columns exactly match `end_open`.
            "",
          ],
          "startOpen": [ # If the start is open, then the range excludes rows whose first
              # `len(start_open)` key columns exactly match `start_open`.
            "",
          ],
          "endClosed": [ # If the end is closed, then the range includes all rows whose
              # first `len(end_closed)` key columns exactly match `end_closed`.
            "",
          ],
          "startClosed": [ # If the start is closed, then the range includes all rows whose
              # first `len(start_closed)` key columns exactly match `start_closed`.
            "",
          ],
        },
      ],
      "keys": [ # A list of specific keys. Entries in `keys` should have exactly as
          # many elements as there are columns in the primary or index key
          # with which this `KeySet` is used.  Individual key values are
          # encoded as described here.
        [
          "",
        ],
      ],
      "all": True or False, # For convenience `all` can be set to `true` to indicate that this
          # `KeySet` matches all keys in the table or index. Note that any keys
          # specified in `keys` or `ranges` are only yielded once.
    },
    "partitionOptions": { # Options for a PartitionQueryRequest and # Additional options that affect how many partitions are created.
        # PartitionReadRequest.
      "maxPartitions": "A String", # **Note:** This hint is currently ignored by PartitionQuery and
          # PartitionRead requests.
          #
          # The desired maximum number of partitions to return.  For example, this may
          # be set to the number of workers available.  The default for this option
          # is currently 10,000. The maximum value is currently 200,000.  This is only
          # a hint.  The actual number of partitions returned may be smaller or larger
          # than this maximum count request.
      "partitionSizeBytes": "A String", # **Note:** This hint is currently ignored by PartitionQuery and
          # PartitionRead requests.
          #
          # The desired data size for each partition generated.  The default for this
          # option is currently 1 GiB.  This is only a hint. The actual size of each
          # partition may be smaller or larger than this size request.
    },
    "table": "A String", # Required. The name of the table in the database to be read.
    "columns": [ # The columns of table to be returned for each row matching
        # this request.
      "A String",
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for PartitionQuery
      # or PartitionRead
    "transaction": { # A transaction. # Transaction created by this request.
      "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
          # for the transaction. Not returned by default: see
          # TransactionOptions.ReadOnly.return_read_timestamp.
          #
          # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
          # Example: `"2014-10-02T15:01:23.045123456Z"`.
      "id": "A String", # `id` may be used to identify the transaction in subsequent
          # Read,
          # ExecuteSql,
          # Commit, or
          # Rollback calls.
          #
          # Single-use read-only transactions do not have IDs, because
          # single-use transactions do not support multiple requests.
    },
    "partitions": [ # Partitions created by this request.
      { # Information returned for each partition returned in a
          # PartitionResponse.
        "partitionToken": "A String", # This token can be passed to Read, StreamingRead, ExecuteSql, or
            # ExecuteStreamingSql requests to restrict the results to those identified by
            # this partition token.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="read">read(session, body, x__xgafv=None)</code>
  <pre>Reads rows from the database using key lookups and scans, as a
simple key/value style alternative to
ExecuteSql.  This method cannot be used to
return a result set larger than 10 MiB; if the read matches more
data than that, the read fails with a `FAILED_PRECONDITION`
error.

Reads inside read-write transactions might return `ABORTED`. If
this occurs, the application should restart the transaction from
the beginning. See Transaction for more details.

Larger result sets can be yielded in streaming fashion by calling
StreamingRead instead.

Args:
  session: string, Required. The session in which the read should be performed. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for Read and
      # StreamingRead.
    "index": "A String", # If non-empty, the name of an index on table. This index is
        # used instead of the table primary key when interpreting key_set
        # and sorting result rows. See key_set for further information.
    "transaction": { # This message is used to select the transaction in which a # The transaction to use. If none is provided, the default is a
        # temporary read-only transaction with strong concurrency.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "resumeToken": "A String", # If this request is resuming a previously interrupted read,
        # `resume_token` should be copied from the last
        # PartialResultSet yielded before the interruption. Doing this
        # enables the new read to resume where the last read left off. The
        # rest of the request parameters must exactly match the request
        # that yielded this token.
    "partitionToken": "A String", # If present, results will be restricted to the specified partition
        # previously created using PartitionRead().    There must be an exact
        # match for the values of fields common to this message and the
        # PartitionReadRequest message used to create this partition_token.
    "keySet": { # `KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All # Required. `key_set` identifies the rows to be yielded. `key_set` names the
        # primary keys of the rows in table to be yielded, unless index
        # is present. If index is present, then key_set instead names
        # index keys in index.
        # 
        # If the partition_token field is empty, rows are yielded
        # in table primary key order (if index is empty) or index key order
        # (if index is non-empty).  If the partition_token field is not
        # empty, rows will be yielded in an unspecified order.
        # 
        # It is not an error for the `key_set` to name rows that do not
        # exist in the database. Read yields nothing for nonexistent rows.
        # the keys are expected to be in the same table or index. The keys need
        # not be sorted in any particular way.
        #
        # If the same key is specified multiple times in the set (for example
        # if two ranges, two keys, or a key and a range overlap), Cloud Spanner
        # behaves as if the key were only specified once.
      "ranges": [ # A list of key ranges. See KeyRange for more information about
          # key range specifications.
        { # KeyRange represents a range of rows in a table or index.
            #
            # A range has a start key and an end key. These keys can be open or
            # closed, indicating if the range includes rows with that key.
            #
            # Keys are represented by lists, where the ith value in the list
            # corresponds to the ith component of the table or index primary key.
            # Individual values are encoded as described
            # here.
            #
            # For example, consider the following table definition:
            #
            #     CREATE TABLE UserEvents (
            #       UserName STRING(MAX),
            #       EventDate STRING(10)
            #     ) PRIMARY KEY(UserName, EventDate);
            #
            # The following keys name rows in this table:
            #
            #     "Bob", "2014-09-23"
            #
            # Since the `UserEvents` table's `PRIMARY KEY` clause names two
            # columns, each `UserEvents` key has two elements; the first is the
            # `UserName`, and the second is the `EventDate`.
            #
            # Key ranges with multiple components are interpreted
            # lexicographically by component using the table or index key's declared
            # sort order. For example, the following range returns all events for
            # user `"Bob"` that occurred in the year 2015:
            #
            #     "start_closed": ["Bob", "2015-01-01"]
            #     "end_closed": ["Bob", "2015-12-31"]
            #
            # Start and end keys can omit trailing key components. This affects the
            # inclusion and exclusion of rows that exactly match the provided key
            # components: if the key is closed, then rows that exactly match the
            # provided components are included; if the key is open, then rows
            # that exactly match are not included.
            #
            # For example, the following range includes all events for `"Bob"` that
            # occurred during and after the year 2000:
            #
            #     "start_closed": ["Bob", "2000-01-01"]
            #     "end_closed": ["Bob"]
            #
            # The next example retrieves all events for `"Bob"`:
            #
            #     "start_closed": ["Bob"]
            #     "end_closed": ["Bob"]
            #
            # To retrieve events before the year 2000:
            #
            #     "start_closed": ["Bob"]
            #     "end_open": ["Bob", "2000-01-01"]
            #
            # The following range includes all rows in the table:
            #
            #     "start_closed": []
            #     "end_closed": []
            #
            # This range returns all users whose `UserName` begins with any
            # character from A to C:
            #
            #     "start_closed": ["A"]
            #     "end_open": ["D"]
            #
            # This range returns all users whose `UserName` begins with B:
            #
            #     "start_closed": ["B"]
            #     "end_open": ["C"]
            #
            # Key ranges honor column sort order. For example, suppose a table is
            # defined as follows:
            #
            #     CREATE TABLE DescendingSortedTable {
            #       Key INT64,
            #       ...
            #     ) PRIMARY KEY(Key DESC);
            #
            # The following range retrieves all rows with key values between 1
            # and 100 inclusive:
            #
            #     "start_closed": ["100"]
            #     "end_closed": ["1"]
            #
            # Note that 100 is passed as the start, and 1 is passed as the end,
            # because `Key` is a descending column in the schema.
          "endOpen": [ # If the end is open, then the range excludes rows whose first
              # `len(end_open)` key columns exactly match `end_open`.
            "",
          ],
          "startOpen": [ # If the start is open, then the range excludes rows whose first
              # `len(start_open)` key columns exactly match `start_open`.
            "",
          ],
          "endClosed": [ # If the end is closed, then the range includes all rows whose
              # first `len(end_closed)` key columns exactly match `end_closed`.
            "",
          ],
          "startClosed": [ # If the start is closed, then the range includes all rows whose
              # first `len(start_closed)` key columns exactly match `start_closed`.
            "",
          ],
        },
      ],
      "keys": [ # A list of specific keys. Entries in `keys` should have exactly as
          # many elements as there are columns in the primary or index key
          # with which this `KeySet` is used.  Individual key values are
          # encoded as described here.
        [
          "",
        ],
      ],
      "all": True or False, # For convenience `all` can be set to `true` to indicate that this
          # `KeySet` matches all keys in the table or index. Note that any keys
          # specified in `keys` or `ranges` are only yielded once.
    },
    "limit": "A String", # If greater than zero, only the first `limit` rows are yielded. If `limit`
        # is zero, the default is no limit. A limit cannot be specified if
        # `partition_token` is set.
    "table": "A String", # Required. The name of the table in the database to be read.
    "columns": [ # The columns of table to be returned for each row matching
        # this request.
      "A String",
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Results from Read or
      # ExecuteSql.
    "rows": [ # Each element in `rows` is a row whose format is defined by
        # metadata.row_type. The ith element
        # in each row matches the ith field in
        # metadata.row_type. Elements are
        # encoded based on type as described
        # here.
      [
        "",
      ],
    ],
    "stats": { # Additional statistics about a ResultSet or PartialResultSet. # Query plan and execution statistics for the SQL statement that
        # produced this result set. These can be requested by setting
        # ExecuteSqlRequest.query_mode.
        # DML statements always produce stats containing the number of rows
        # modified, unless executed using the
        # ExecuteSqlRequest.QueryMode.PLAN ExecuteSqlRequest.query_mode.
        # Other fields may or may not be populated, based on the
        # ExecuteSqlRequest.query_mode.
      "rowCountLowerBound": "A String", # Partitioned DML does not offer exactly-once semantics, so it
          # returns a lower bound of the rows modified.
      "rowCountExact": "A String", # Standard DML returns an exact count of rows that were modified.
      "queryPlan": { # Contains an ordered list of nodes appearing in the query plan. # QueryPlan for the query associated with this result.
        "planNodes": [ # The nodes in the query plan. Plan nodes are returned in pre-order starting
            # with the plan root. Each PlanNode's `id` corresponds to its index in
            # `plan_nodes`.
          { # Node information for nodes appearing in a QueryPlan.plan_nodes.
            "index": 42, # The `PlanNode`'s index in node list.
            "kind": "A String", # Used to determine the type of node. May be needed for visualizing
                # different kinds of nodes differently. For example, If the node is a
                # SCALAR node, it will have a condensed representation
                # which can be used to directly embed a description of the node in its
                # parent.
            "displayName": "A String", # The display name for the node.
            "executionStats": { # The execution statistics associated with the node, contained in a group of
                # key-value pairs. Only present if the plan was returned as a result of a
                # profile query. For example, number of executions, number of rows/time per
                # execution etc.
              "a_key": "", # Properties of the object.
            },
            "childLinks": [ # List of child node `index`es and their relationship to this parent.
              { # Metadata associated with a parent-child relationship appearing in a
                  # PlanNode.
                "variable": "A String", # Only present if the child node is SCALAR and corresponds
                    # to an output variable of the parent node. The field carries the name of
                    # the output variable.
                    # For example, a `TableScan` operator that reads rows from a table will
                    # have child links to the `SCALAR` nodes representing the output variables
                    # created for each column that is read by the operator. The corresponding
                    # `variable` fields will be set to the variable names assigned to the
                    # columns.
                "childIndex": 42, # The node to which the link points.
                "type": "A String", # The type of the link. For example, in Hash Joins this could be used to
                    # distinguish between the build child and the probe child, or in the case
                    # of the child being an output variable, to represent the tag associated
                    # with the output variable.
              },
            ],
            "shortRepresentation": { # Condensed representation of a node and its subtree. Only present for # Condensed representation for SCALAR nodes.
                # `SCALAR` PlanNode(s).
              "subqueries": { # A mapping of (subquery variable name) -> (subquery node id) for cases
                  # where the `description` string of this node references a `SCALAR`
                  # subquery contained in the expression subtree rooted at this node. The
                  # referenced `SCALAR` subquery may not necessarily be a direct child of
                  # this node.
                "a_key": 42,
              },
              "description": "A String", # A string representation of the expression subtree rooted at this node.
            },
            "metadata": { # Attributes relevant to the node contained in a group of key-value pairs.
                # For example, a Parameter Reference node could have the following
                # information in its metadata:
                #
                #     {
                #       "parameter_reference": "param1",
                #       "parameter_type": "array"
                #     }
              "a_key": "", # Properties of the object.
            },
          },
        ],
      },
      "queryStats": { # Aggregated statistics from the execution of the query. Only present when
          # the query is profiled. For example, a query could return the statistics as
          # follows:
          #
          #     {
          #       "rows_returned": "3",
          #       "elapsed_time": "1.22 secs",
          #       "cpu_time": "1.19 secs"
          #     }
        "a_key": "", # Properties of the object.
      },
    },
    "metadata": { # Metadata about a ResultSet or PartialResultSet. # Metadata about the result set, such as row type information.
      "rowType": { # `StructType` defines the fields of a STRUCT type. # Indicates the field names and types for the rows in the result
          # set.  For example, a SQL query like `"SELECT UserId, UserName FROM
          # Users"` could return a `row_type` value like:
          #
          #     "fields": [
          #       { "name": "UserId", "type": { "code": "INT64" } },
          #       { "name": "UserName", "type": { "code": "STRING" } },
          #     ]
        "fields": [ # The list of fields that make up this struct. Order is
            # significant, because values of this struct type are represented as
            # lists, where the order of field values matches the order of
            # fields in the StructType. In turn, the order of fields
            # matches the order of columns in a read request, or the order of
            # fields in the `SELECT` clause of a query.
          { # Message representing a single field of a struct.
            "type": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a # The type of the field.
                # table cell or returned from an SQL query.
              "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
                  # provides type information for the struct's fields.
              "code": "A String", # Required. The TypeCode for this type.
              "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
                  # is the type of the array elements.
            },
            "name": "A String", # The name of the field. For reads, this is the column name. For
                # SQL queries, it is the column alias (e.g., `"Word"` in the
                # query `"SELECT 'hello' AS Word"`), or the column name (e.g.,
                # `"ColName"` in the query `"SELECT ColName FROM Table"`). Some
                # columns might have an empty name (e.g., !"SELECT
                # UPPER(ColName)"`). Note that a query result can contain
                # multiple fields with the same name.
          },
        ],
      },
      "transaction": { # A transaction. # If the read or SQL query began a transaction as a side-effect, the
          # information about the new transaction is yielded here.
        "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
            # for the transaction. Not returned by default: see
            # TransactionOptions.ReadOnly.return_read_timestamp.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "id": "A String", # `id` may be used to identify the transaction in subsequent
            # Read,
            # ExecuteSql,
            # Commit, or
            # Rollback calls.
            #
            # Single-use read-only transactions do not have IDs, because
            # single-use transactions do not support multiple requests.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="rollback">rollback(session, body, x__xgafv=None)</code>
  <pre>Rolls back a transaction, releasing any locks it holds. It is a good
idea to call this for any transaction that includes one or more
Read or ExecuteSql requests and
ultimately decides not to commit.

`Rollback` returns `OK` if it successfully aborts the transaction, the
transaction was already aborted, or the transaction is not
found. `Rollback` never returns `ABORTED`.

Args:
  session: string, Required. The session in which the transaction to roll back is running. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for Rollback.
    "transactionId": "A String", # Required. The transaction to roll back.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="streamingRead">streamingRead(session, body, x__xgafv=None)</code>
  <pre>Like Read, except returns the result set as a
stream. Unlike Read, there is no limit on the
size of the returned result set. However, no individual row in
the result set can exceed 100 MiB, and no column value can exceed
10 MiB.

Args:
  session: string, Required. The session in which the read should be performed. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for Read and
      # StreamingRead.
    "index": "A String", # If non-empty, the name of an index on table. This index is
        # used instead of the table primary key when interpreting key_set
        # and sorting result rows. See key_set for further information.
    "transaction": { # This message is used to select the transaction in which a # The transaction to use. If none is provided, the default is a
        # temporary read-only transaction with strong concurrency.
        # Read or
        # ExecuteSql call runs.
        #
        # See TransactionOptions for more information about transactions.
      "begin": { # # Transactions # Begin a new transaction and execute this read or SQL query in
          # it. The transaction ID of the new transaction is returned in
          # ResultSetMetadata.transaction, which is a Transaction.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "singleUse": { # # Transactions # Execute the read or SQL query in a temporary transaction.
          # This is the most efficient way to execute a transaction that
          # consists of a single SQL query.
          #
          #
          # Each session can have at most one active transaction at a time. After the
          # active transaction is completed, the session can immediately be
          # re-used for the next transaction. It is not necessary to create a
          # new session for each transaction.
          #
          # # Transaction Modes
          #
          # Cloud Spanner supports three transaction modes:
          #
          #   1. Locking read-write. This type of transaction is the only way
          #      to write data into Cloud Spanner. These transactions rely on
          #      pessimistic locking and, if necessary, two-phase commit.
          #      Locking read-write transactions may abort, requiring the
          #      application to retry.
          #
          #   2. Snapshot read-only. This transaction type provides guaranteed
          #      consistency across several reads, but does not allow
          #      writes. Snapshot read-only transactions can be configured to
          #      read at timestamps in the past. Snapshot read-only
          #      transactions do not need to be committed.
          #
          #   3. Partitioned DML. This type of transaction is used to execute
          #      a single Partitioned DML statement. Partitioned DML partitions
          #      the key space and runs the DML statement over each partition
          #      in parallel using separate, internal transactions that commit
          #      independently. Partitioned DML transactions do not need to be
          #      committed.
          #
          # For transactions that only read, snapshot read-only transactions
          # provide simpler semantics and are almost always faster. In
          # particular, read-only transactions do not take locks, so they do
          # not conflict with read-write transactions. As a consequence of not
          # taking locks, they also do not abort, so retry loops are not needed.
          #
          # Transactions may only read/write data in a single database. They
          # may, however, read/write data in different tables within that
          # database.
          #
          # ## Locking Read-Write Transactions
          #
          # Locking transactions may be used to atomically read-modify-write
          # data anywhere in a database. This type of transaction is externally
          # consistent.
          #
          # Clients should attempt to minimize the amount of time a transaction
          # is active. Faster transactions commit with higher probability
          # and cause less contention. Cloud Spanner attempts to keep read locks
          # active as long as the transaction continues to do reads, and the
          # transaction has not been terminated by
          # Commit or
          # Rollback.  Long periods of
          # inactivity at the client may cause Cloud Spanner to release a
          # transaction's locks and abort it.
          #
          # Conceptually, a read-write transaction consists of zero or more
          # reads or SQL statements followed by
          # Commit. At any time before
          # Commit, the client can send a
          # Rollback request to abort the
          # transaction.
          #
          # ### Semantics
          #
          # Cloud Spanner can commit the transaction if all read locks it acquired
          # are still valid at commit time, and it is able to acquire write
          # locks for all writes. Cloud Spanner can abort the transaction for any
          # reason. If a commit attempt returns `ABORTED`, Cloud Spanner guarantees
          # that the transaction has not modified any user data in Cloud Spanner.
          #
          # Unless the transaction commits, Cloud Spanner makes no guarantees about
          # how long the transaction's locks were held for. It is an error to
          # use Cloud Spanner locks for any sort of mutual exclusion other than
          # between Cloud Spanner transactions themselves.
          #
          # ### Retrying Aborted Transactions
          #
          # When a transaction aborts, the application can choose to retry the
          # whole transaction again. To maximize the chances of successfully
          # committing the retry, the client should execute the retry in the
          # same session as the original attempt. The original session's lock
          # priority increases with each consecutive abort, meaning that each
          # attempt has a slightly better chance of success than the previous.
          #
          # Under some circumstances (e.g., many transactions attempting to
          # modify the same row(s)), a transaction can abort many times in a
          # short period before successfully committing. Thus, it is not a good
          # idea to cap the number of retries a transaction can attempt;
          # instead, it is better to limit the total amount of wall time spent
          # retrying.
          #
          # ### Idle Transactions
          #
          # A transaction is considered idle if it has no outstanding reads or
          # SQL queries and has not started a read or SQL query within the last 10
          # seconds. Idle transactions can be aborted by Cloud Spanner so that they
          # don't hold on to locks indefinitely. In that case, the commit will
          # fail with error `ABORTED`.
          #
          # If this behavior is undesirable, periodically executing a simple
          # SQL query in the transaction (e.g., `SELECT 1`) prevents the
          # transaction from becoming idle.
          #
          # ## Snapshot Read-Only Transactions
          #
          # Snapshot read-only transactions provides a simpler method than
          # locking read-write transactions for doing several consistent
          # reads. However, this type of transaction does not support writes.
          #
          # Snapshot transactions do not take locks. Instead, they work by
          # choosing a Cloud Spanner timestamp, then executing all reads at that
          # timestamp. Since they do not acquire locks, they do not block
          # concurrent read-write transactions.
          #
          # Unlike locking read-write transactions, snapshot read-only
          # transactions never abort. They can fail if the chosen read
          # timestamp is garbage collected; however, the default garbage
          # collection policy is generous enough that most applications do not
          # need to worry about this in practice.
          #
          # Snapshot read-only transactions do not need to call
          # Commit or
          # Rollback (and in fact are not
          # permitted to do so).
          #
          # To execute a snapshot transaction, the client specifies a timestamp
          # bound, which tells Cloud Spanner how to choose a read timestamp.
          #
          # The types of timestamp bound are:
          #
          #   - Strong (the default).
          #   - Bounded staleness.
          #   - Exact staleness.
          #
          # If the Cloud Spanner database to be read is geographically distributed,
          # stale read-only transactions can execute more quickly than strong
          # or read-write transaction, because they are able to execute far
          # from the leader replica.
          #
          # Each type of timestamp bound is discussed in detail below.
          #
          # ### Strong
          #
          # Strong reads are guaranteed to see the effects of all transactions
          # that have committed before the start of the read. Furthermore, all
          # rows yielded by a single read are consistent with each other -- if
          # any part of the read observes a transaction, all parts of the read
          # see the transaction.
          #
          # Strong reads are not repeatable: two consecutive strong read-only
          # transactions might return inconsistent results if there are
          # concurrent writes. If consistency across reads is required, the
          # reads should be executed within a transaction or at an exact read
          # timestamp.
          #
          # See TransactionOptions.ReadOnly.strong.
          #
          # ### Exact Staleness
          #
          # These timestamp bounds execute reads at a user-specified
          # timestamp. Reads at a timestamp are guaranteed to see a consistent
          # prefix of the global transaction history: they observe
          # modifications done by all transactions with a commit timestamp <=
          # the read timestamp, and observe none of the modifications done by
          # transactions with a larger commit timestamp. They will block until
          # all conflicting transactions that may be assigned commit timestamps
          # <= the read timestamp have finished.
          #
          # The timestamp can either be expressed as an absolute Cloud Spanner commit
          # timestamp or a staleness relative to the current time.
          #
          # These modes do not require a "negotiation phase" to pick a
          # timestamp. As a result, they execute slightly faster than the
          # equivalent boundedly stale concurrency modes. On the other hand,
          # boundedly stale reads usually return fresher results.
          #
          # See TransactionOptions.ReadOnly.read_timestamp and
          # TransactionOptions.ReadOnly.exact_staleness.
          #
          # ### Bounded Staleness
          #
          # Bounded staleness modes allow Cloud Spanner to pick the read timestamp,
          # subject to a user-provided staleness bound. Cloud Spanner chooses the
          # newest timestamp within the staleness bound that allows execution
          # of the reads at the closest available replica without blocking.
          #
          # All rows yielded are consistent with each other -- if any part of
          # the read observes a transaction, all parts of the read see the
          # transaction. Boundedly stale reads are not repeatable: two stale
          # reads, even if they use the same staleness bound, can execute at
          # different timestamps and thus return inconsistent results.
          #
          # Boundedly stale reads execute in two phases: the first phase
          # negotiates a timestamp among all replicas needed to serve the
          # read. In the second phase, reads are executed at the negotiated
          # timestamp.
          #
          # As a result of the two phase execution, bounded staleness reads are
          # usually a little slower than comparable exact staleness
          # reads. However, they are typically able to return fresher
          # results, and are more likely to execute at the closest replica.
          #
          # Because the timestamp negotiation requires up-front knowledge of
          # which rows will be read, it can only be used with single-use
          # read-only transactions.
          #
          # See TransactionOptions.ReadOnly.max_staleness and
          # TransactionOptions.ReadOnly.min_read_timestamp.
          #
          # ### Old Read Timestamps and Garbage Collection
          #
          # Cloud Spanner continuously garbage collects deleted and overwritten data
          # in the background to reclaim storage space. This process is known
          # as "version GC". By default, version GC reclaims versions after they
          # are one hour old. Because of this, Cloud Spanner cannot perform reads
          # at read timestamps more than one hour in the past. This
          # restriction also applies to in-progress reads and/or SQL queries whose
          # timestamp become too old while executing. Reads and SQL queries with
          # too-old read timestamps fail with the error `FAILED_PRECONDITION`.
          #
          # ## Partitioned DML Transactions
          #
          # Partitioned DML transactions are used to execute DML statements with a
          # different execution strategy that provides different, and often better,
          # scalability properties for large, table-wide operations than DML in a
          # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
          # should prefer using ReadWrite transactions.
          #
          # Partitioned DML partitions the keyspace and runs the DML statement on each
          # partition in separate, internal transactions. These transactions commit
          # automatically when complete, and run independently from one another.
          #
          # To reduce lock contention, this execution strategy only acquires read locks
          # on rows that match the WHERE clause of the statement. Additionally, the
          # smaller per-partition transactions hold locks for less time.
          #
          # That said, Partitioned DML is not a drop-in replacement for standard DML used
          # in ReadWrite transactions.
          #
          #  - The DML statement must be fully-partitionable. Specifically, the statement
          #    must be expressible as the union of many statements which each access only
          #    a single row of the table.
          #
          #  - The statement is not applied atomically to all rows of the table. Rather,
          #    the statement is applied atomically to partitions of the table, in
          #    independent transactions. Secondary index rows are updated atomically
          #    with the base table rows.
          #
          #  - Partitioned DML does not guarantee exactly-once execution semantics
          #    against a partition. The statement will be applied at least once to each
          #    partition. It is strongly recommended that the DML statement should be
          #    idempotent to avoid unexpected results. For instance, it is potentially
          #    dangerous to run a statement such as
          #    `UPDATE table SET column = column + 1` as it could be run multiple times
          #    against some rows.
          #
          #  - The partitions are committed automatically - there is no support for
          #    Commit or Rollback. If the call returns an error, or if the client issuing
          #    the ExecuteSql call dies, it is possible that some rows had the statement
          #    executed on them successfully. It is also possible that statement was
          #    never executed against other rows.
          #
          #  - Partitioned DML transactions may only contain the execution of a single
          #    DML statement via ExecuteSql or ExecuteStreamingSql.
          #
          #  - If any error is encountered during the execution of the partitioned DML
          #    operation (for instance, a UNIQUE INDEX violation, division by zero, or a
          #    value that cannot be stored due to schema constraints), then the
          #    operation is stopped at that point and an error is returned. It is
          #    possible that at this point, some partitions have been committed (or even
          #    committed multiple times), and other partitions have not been run at all.
          #
          # Given the above, Partitioned DML is good fit for large, database-wide,
          # operations that are idempotent, such as deleting old rows from a very large
          # table.
        "readWrite": { # Message type to initiate a read-write transaction. Currently this # Transaction may write.
            #
            # Authorization to begin a read-write transaction requires
            # `spanner.databases.beginOrRollbackReadWriteTransaction` permission
            # on the `session` resource.
            # transaction type has no options.
        },
        "readOnly": { # Message type to initiate a read-only transaction. # Transaction will not write.
            #
            # Authorization to begin a read-only transaction requires
            # `spanner.databases.beginReadOnlyTransaction` permission
            # on the `session` resource.
          "minReadTimestamp": "A String", # Executes all reads at a timestamp >= `min_read_timestamp`.
              #
              # This is useful for requesting fresher data than some previous
              # read, or data that is fresh enough to observe the effects of some
              # previously committed transaction whose timestamp is known.
              #
              # Note that this option can only be used in single-use transactions.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "returnReadTimestamp": True or False, # If true, the Cloud Spanner-selected read timestamp is included in
              # the Transaction message that describes the transaction.
          "maxStaleness": "A String", # Read data at a timestamp >= `NOW - max_staleness`
              # seconds. Guarantees that all writes that have committed more
              # than the specified number of seconds ago are visible. Because
              # Cloud Spanner chooses the exact timestamp, this mode works even if
              # the client's local clock is substantially skewed from Cloud Spanner
              # commit timestamps.
              #
              # Useful for reading the freshest data available at a nearby
              # replica, while bounding the possible staleness if the local
              # replica has fallen behind.
              #
              # Note that this option can only be used in single-use
              # transactions.
          "exactStaleness": "A String", # Executes all reads at a timestamp that is `exact_staleness`
              # old. The timestamp is chosen soon after the read is started.
              #
              # Guarantees that all writes that have committed more than the
              # specified number of seconds ago are visible. Because Cloud Spanner
              # chooses the exact timestamp, this mode works even if the client's
              # local clock is substantially skewed from Cloud Spanner commit
              # timestamps.
              #
              # Useful for reading at nearby replicas without the distributed
              # timestamp negotiation overhead of `max_staleness`.
          "readTimestamp": "A String", # Executes all reads at the given timestamp. Unlike other modes,
              # reads at a specific timestamp are repeatable; the same read at
              # the same timestamp always returns the same data. If the
              # timestamp is in the future, the read will block until the
              # specified timestamp, modulo the read's deadline.
              #
              # Useful for large scale consistent reads such as mapreduces, or
              # for coordinating many reads against a consistent snapshot of the
              # data.
              #
              # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
              # Example: `"2014-10-02T15:01:23.045123456Z"`.
          "strong": True or False, # Read at a timestamp where all previously committed transactions
              # are visible.
        },
        "partitionedDml": { # Message type to initiate a Partitioned DML transaction. # Partitioned DML transaction.
            #
            # Authorization to begin a Partitioned DML transaction requires
            # `spanner.databases.beginPartitionedDmlTransaction` permission
            # on the `session` resource.
        },
      },
      "id": "A String", # Execute the read or SQL query in a previously-started transaction.
    },
    "resumeToken": "A String", # If this request is resuming a previously interrupted read,
        # `resume_token` should be copied from the last
        # PartialResultSet yielded before the interruption. Doing this
        # enables the new read to resume where the last read left off. The
        # rest of the request parameters must exactly match the request
        # that yielded this token.
    "partitionToken": "A String", # If present, results will be restricted to the specified partition
        # previously created using PartitionRead().    There must be an exact
        # match for the values of fields common to this message and the
        # PartitionReadRequest message used to create this partition_token.
    "keySet": { # `KeySet` defines a collection of Cloud Spanner keys and/or key ranges. All # Required. `key_set` identifies the rows to be yielded. `key_set` names the
        # primary keys of the rows in table to be yielded, unless index
        # is present. If index is present, then key_set instead names
        # index keys in index.
        # 
        # If the partition_token field is empty, rows are yielded
        # in table primary key order (if index is empty) or index key order
        # (if index is non-empty).  If the partition_token field is not
        # empty, rows will be yielded in an unspecified order.
        # 
        # It is not an error for the `key_set` to name rows that do not
        # exist in the database. Read yields nothing for nonexistent rows.
        # the keys are expected to be in the same table or index. The keys need
        # not be sorted in any particular way.
        #
        # If the same key is specified multiple times in the set (for example
        # if two ranges, two keys, or a key and a range overlap), Cloud Spanner
        # behaves as if the key were only specified once.
      "ranges": [ # A list of key ranges. See KeyRange for more information about
          # key range specifications.
        { # KeyRange represents a range of rows in a table or index.
            #
            # A range has a start key and an end key. These keys can be open or
            # closed, indicating if the range includes rows with that key.
            #
            # Keys are represented by lists, where the ith value in the list
            # corresponds to the ith component of the table or index primary key.
            # Individual values are encoded as described
            # here.
            #
            # For example, consider the following table definition:
            #
            #     CREATE TABLE UserEvents (
            #       UserName STRING(MAX),
            #       EventDate STRING(10)
            #     ) PRIMARY KEY(UserName, EventDate);
            #
            # The following keys name rows in this table:
            #
            #     "Bob", "2014-09-23"
            #
            # Since the `UserEvents` table's `PRIMARY KEY` clause names two
            # columns, each `UserEvents` key has two elements; the first is the
            # `UserName`, and the second is the `EventDate`.
            #
            # Key ranges with multiple components are interpreted
            # lexicographically by component using the table or index key's declared
            # sort order. For example, the following range returns all events for
            # user `"Bob"` that occurred in the year 2015:
            #
            #     "start_closed": ["Bob", "2015-01-01"]
            #     "end_closed": ["Bob", "2015-12-31"]
            #
            # Start and end keys can omit trailing key components. This affects the
            # inclusion and exclusion of rows that exactly match the provided key
            # components: if the key is closed, then rows that exactly match the
            # provided components are included; if the key is open, then rows
            # that exactly match are not included.
            #
            # For example, the following range includes all events for `"Bob"` that
            # occurred during and after the year 2000:
            #
            #     "start_closed": ["Bob", "2000-01-01"]
            #     "end_closed": ["Bob"]
            #
            # The next example retrieves all events for `"Bob"`:
            #
            #     "start_closed": ["Bob"]
            #     "end_closed": ["Bob"]
            #
            # To retrieve events before the year 2000:
            #
            #     "start_closed": ["Bob"]
            #     "end_open": ["Bob", "2000-01-01"]
            #
            # The following range includes all rows in the table:
            #
            #     "start_closed": []
            #     "end_closed": []
            #
            # This range returns all users whose `UserName` begins with any
            # character from A to C:
            #
            #     "start_closed": ["A"]
            #     "end_open": ["D"]
            #
            # This range returns all users whose `UserName` begins with B:
            #
            #     "start_closed": ["B"]
            #     "end_open": ["C"]
            #
            # Key ranges honor column sort order. For example, suppose a table is
            # defined as follows:
            #
            #     CREATE TABLE DescendingSortedTable {
            #       Key INT64,
            #       ...
            #     ) PRIMARY KEY(Key DESC);
            #
            # The following range retrieves all rows with key values between 1
            # and 100 inclusive:
            #
            #     "start_closed": ["100"]
            #     "end_closed": ["1"]
            #
            # Note that 100 is passed as the start, and 1 is passed as the end,
            # because `Key` is a descending column in the schema.
          "endOpen": [ # If the end is open, then the range excludes rows whose first
              # `len(end_open)` key columns exactly match `end_open`.
            "",
          ],
          "startOpen": [ # If the start is open, then the range excludes rows whose first
              # `len(start_open)` key columns exactly match `start_open`.
            "",
          ],
          "endClosed": [ # If the end is closed, then the range includes all rows whose
              # first `len(end_closed)` key columns exactly match `end_closed`.
            "",
          ],
          "startClosed": [ # If the start is closed, then the range includes all rows whose
              # first `len(start_closed)` key columns exactly match `start_closed`.
            "",
          ],
        },
      ],
      "keys": [ # A list of specific keys. Entries in `keys` should have exactly as
          # many elements as there are columns in the primary or index key
          # with which this `KeySet` is used.  Individual key values are
          # encoded as described here.
        [
          "",
        ],
      ],
      "all": True or False, # For convenience `all` can be set to `true` to indicate that this
          # `KeySet` matches all keys in the table or index. Note that any keys
          # specified in `keys` or `ranges` are only yielded once.
    },
    "limit": "A String", # If greater than zero, only the first `limit` rows are yielded. If `limit`
        # is zero, the default is no limit. A limit cannot be specified if
        # `partition_token` is set.
    "table": "A String", # Required. The name of the table in the database to be read.
    "columns": [ # The columns of table to be returned for each row matching
        # this request.
      "A String",
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Partial results from a streaming read or SQL query. Streaming reads and
      # SQL queries better tolerate large result sets, large rows, and large
      # values, but are a little trickier to consume.
    "resumeToken": "A String", # Streaming calls might be interrupted for a variety of reasons, such
        # as TCP connection loss. If this occurs, the stream of results can
        # be resumed by re-sending the original request and including
        # `resume_token`. Note that executing any other transaction in the
        # same session invalidates the token.
    "chunkedValue": True or False, # If true, then the final value in values is chunked, and must
        # be combined with more values from subsequent `PartialResultSet`s
        # to obtain a complete field value.
    "values": [ # A streamed result set consists of a stream of values, which might
        # be split into many `PartialResultSet` messages to accommodate
        # large rows and/or large values. Every N complete values defines a
        # row, where N is equal to the number of entries in
        # metadata.row_type.fields.
        #
        # Most values are encoded based on type as described
        # here.
        #
        # It is possible that the last value in values is "chunked",
        # meaning that the rest of the value is sent in subsequent
        # `PartialResultSet`(s). This is denoted by the chunked_value
        # field. Two or more chunked values can be merged to form a
        # complete value as follows:
        #
        #   * `bool/number/null`: cannot be chunked
        #   * `string`: concatenate the strings
        #   * `list`: concatenate the lists. If the last element in a list is a
        #     `string`, `list`, or `object`, merge it with the first element in
        #     the next list by applying these rules recursively.
        #   * `object`: concatenate the (field name, field value) pairs. If a
        #     field name is duplicated, then apply these rules recursively
        #     to merge the field values.
        #
        # Some examples of merging:
        #
        #     # Strings are concatenated.
        #     "foo", "bar" => "foobar"
        #
        #     # Lists of non-strings are concatenated.
        #     [2, 3], [4] => [2, 3, 4]
        #
        #     # Lists are concatenated, but the last and first elements are merged
        #     # because they are strings.
        #     ["a", "b"], ["c", "d"] => ["a", "bc", "d"]
        #
        #     # Lists are concatenated, but the last and first elements are merged
        #     # because they are lists. Recursively, the last and first elements
        #     # of the inner lists are merged because they are strings.
        #     ["a", ["b", "c"]], [["d"], "e"] => ["a", ["b", "cd"], "e"]
        #
        #     # Non-overlapping object fields are combined.
        #     {"a": "1"}, {"b": "2"} => {"a": "1", "b": 2"}
        #
        #     # Overlapping object fields are merged.
        #     {"a": "1"}, {"a": "2"} => {"a": "12"}
        #
        #     # Examples of merging objects containing lists of strings.
        #     {"a": ["1"]}, {"a": ["2"]} => {"a": ["12"]}
        #
        # For a more complete example, suppose a streaming SQL query is
        # yielding a result set whose rows contain a single string
        # field. The following `PartialResultSet`s might be yielded:
        #
        #     {
        #       "metadata": { ... }
        #       "values": ["Hello", "W"]
        #       "chunked_value": true
        #       "resume_token": "Af65..."
        #     }
        #     {
        #       "values": ["orl"]
        #       "chunked_value": true
        #       "resume_token": "Bqp2..."
        #     }
        #     {
        #       "values": ["d"]
        #       "resume_token": "Zx1B..."
        #     }
        #
        # This sequence of `PartialResultSet`s encodes two rows, one
        # containing the field value `"Hello"`, and a second containing the
        # field value `"World" = "W" + "orl" + "d"`.
      "",
    ],
    "stats": { # Additional statistics about a ResultSet or PartialResultSet. # Query plan and execution statistics for the statement that produced this
        # streaming result set. These can be requested by setting
        # ExecuteSqlRequest.query_mode and are sent
        # only once with the last response in the stream.
        # This field will also be present in the last response for DML
        # statements.
      "rowCountLowerBound": "A String", # Partitioned DML does not offer exactly-once semantics, so it
          # returns a lower bound of the rows modified.
      "rowCountExact": "A String", # Standard DML returns an exact count of rows that were modified.
      "queryPlan": { # Contains an ordered list of nodes appearing in the query plan. # QueryPlan for the query associated with this result.
        "planNodes": [ # The nodes in the query plan. Plan nodes are returned in pre-order starting
            # with the plan root. Each PlanNode's `id` corresponds to its index in
            # `plan_nodes`.
          { # Node information for nodes appearing in a QueryPlan.plan_nodes.
            "index": 42, # The `PlanNode`'s index in node list.
            "kind": "A String", # Used to determine the type of node. May be needed for visualizing
                # different kinds of nodes differently. For example, If the node is a
                # SCALAR node, it will have a condensed representation
                # which can be used to directly embed a description of the node in its
                # parent.
            "displayName": "A String", # The display name for the node.
            "executionStats": { # The execution statistics associated with the node, contained in a group of
                # key-value pairs. Only present if the plan was returned as a result of a
                # profile query. For example, number of executions, number of rows/time per
                # execution etc.
              "a_key": "", # Properties of the object.
            },
            "childLinks": [ # List of child node `index`es and their relationship to this parent.
              { # Metadata associated with a parent-child relationship appearing in a
                  # PlanNode.
                "variable": "A String", # Only present if the child node is SCALAR and corresponds
                    # to an output variable of the parent node. The field carries the name of
                    # the output variable.
                    # For example, a `TableScan` operator that reads rows from a table will
                    # have child links to the `SCALAR` nodes representing the output variables
                    # created for each column that is read by the operator. The corresponding
                    # `variable` fields will be set to the variable names assigned to the
                    # columns.
                "childIndex": 42, # The node to which the link points.
                "type": "A String", # The type of the link. For example, in Hash Joins this could be used to
                    # distinguish between the build child and the probe child, or in the case
                    # of the child being an output variable, to represent the tag associated
                    # with the output variable.
              },
            ],
            "shortRepresentation": { # Condensed representation of a node and its subtree. Only present for # Condensed representation for SCALAR nodes.
                # `SCALAR` PlanNode(s).
              "subqueries": { # A mapping of (subquery variable name) -> (subquery node id) for cases
                  # where the `description` string of this node references a `SCALAR`
                  # subquery contained in the expression subtree rooted at this node. The
                  # referenced `SCALAR` subquery may not necessarily be a direct child of
                  # this node.
                "a_key": 42,
              },
              "description": "A String", # A string representation of the expression subtree rooted at this node.
            },
            "metadata": { # Attributes relevant to the node contained in a group of key-value pairs.
                # For example, a Parameter Reference node could have the following
                # information in its metadata:
                #
                #     {
                #       "parameter_reference": "param1",
                #       "parameter_type": "array"
                #     }
              "a_key": "", # Properties of the object.
            },
          },
        ],
      },
      "queryStats": { # Aggregated statistics from the execution of the query. Only present when
          # the query is profiled. For example, a query could return the statistics as
          # follows:
          #
          #     {
          #       "rows_returned": "3",
          #       "elapsed_time": "1.22 secs",
          #       "cpu_time": "1.19 secs"
          #     }
        "a_key": "", # Properties of the object.
      },
    },
    "metadata": { # Metadata about a ResultSet or PartialResultSet. # Metadata about the result set, such as row type information.
        # Only present in the first response.
      "rowType": { # `StructType` defines the fields of a STRUCT type. # Indicates the field names and types for the rows in the result
          # set.  For example, a SQL query like `"SELECT UserId, UserName FROM
          # Users"` could return a `row_type` value like:
          #
          #     "fields": [
          #       { "name": "UserId", "type": { "code": "INT64" } },
          #       { "name": "UserName", "type": { "code": "STRING" } },
          #     ]
        "fields": [ # The list of fields that make up this struct. Order is
            # significant, because values of this struct type are represented as
            # lists, where the order of field values matches the order of
            # fields in the StructType. In turn, the order of fields
            # matches the order of columns in a read request, or the order of
            # fields in the `SELECT` clause of a query.
          { # Message representing a single field of a struct.
            "type": { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a # The type of the field.
                # table cell or returned from an SQL query.
              "structType": # Object with schema name: StructType # If code == STRUCT, then `struct_type`
                  # provides type information for the struct's fields.
              "code": "A String", # Required. The TypeCode for this type.
              "arrayElementType": # Object with schema name: Type # If code == ARRAY, then `array_element_type`
                  # is the type of the array elements.
            },
            "name": "A String", # The name of the field. For reads, this is the column name. For
                # SQL queries, it is the column alias (e.g., `"Word"` in the
                # query `"SELECT 'hello' AS Word"`), or the column name (e.g.,
                # `"ColName"` in the query `"SELECT ColName FROM Table"`). Some
                # columns might have an empty name (e.g., !"SELECT
                # UPPER(ColName)"`). Note that a query result can contain
                # multiple fields with the same name.
          },
        ],
      },
      "transaction": { # A transaction. # If the read or SQL query began a transaction as a side-effect, the
          # information about the new transaction is yielded here.
        "readTimestamp": "A String", # For snapshot read-only transactions, the read timestamp chosen
            # for the transaction. Not returned by default: see
            # TransactionOptions.ReadOnly.return_read_timestamp.
            #
            # A timestamp in RFC3339 UTC \"Zulu\" format, accurate to nanoseconds.
            # Example: `"2014-10-02T15:01:23.045123456Z"`.
        "id": "A String", # `id` may be used to identify the transaction in subsequent
            # Read,
            # ExecuteSql,
            # Commit, or
            # Rollback calls.
            #
            # Single-use read-only transactions do not have IDs, because
            # single-use transactions do not support multiple requests.
      },
    },
  }</pre>
</div>

</body></html>