google-apis-spanner_v1 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -228,165 +228,45 @@ module Google
228
228
  class BeginTransactionRequest
229
229
  include Google::Apis::Core::Hashable
230
230
 
231
- # Transactions: Each session can have at most one active transaction at a time (
232
- # note that standalone reads and queries use a transaction internally and do
233
- # count towards the one transaction limit). After the active transaction is
234
- # completed, the session can immediately be re-used for the next transaction. It
235
- # is not necessary to create a new session for each transaction. Transaction
236
- # modes: Cloud Spanner supports three transaction modes: 1. Locking read-write.
237
- # This type of transaction is the only way to write data into Cloud Spanner.
238
- # These transactions rely on pessimistic locking and, if necessary, two-phase
239
- # commit. Locking read-write transactions may abort, requiring the application
240
- # to retry. 2. Snapshot read-only. This transaction type provides guaranteed
241
- # consistency across several reads, but does not allow writes. Snapshot read-
242
- # only transactions can be configured to read at timestamps in the past.
243
- # Snapshot read-only transactions do not need to be committed. 3. Partitioned
244
- # DML. This type of transaction is used to execute a single Partitioned DML
245
- # statement. Partitioned DML partitions the key space and runs the DML statement
246
- # over each partition in parallel using separate, internal transactions that
247
- # commit independently. Partitioned DML transactions do not need to be committed.
248
- # For transactions that only read, snapshot read-only transactions provide
249
- # simpler semantics and are almost always faster. In particular, read-only
250
- # transactions do not take locks, so they do not conflict with read-write
251
- # transactions. As a consequence of not taking locks, they also do not abort, so
252
- # retry loops are not needed. Transactions may only read-write data in a single
253
- # database. They may, however, read-write data in different tables within that
254
- # database. Locking read-write transactions: Locking transactions may be used to
255
- # atomically read-modify-write data anywhere in a database. This type of
256
- # transaction is externally consistent. Clients should attempt to minimize the
257
- # amount of time a transaction is active. Faster transactions commit with higher
258
- # probability and cause less contention. Cloud Spanner attempts to keep read
259
- # locks active as long as the transaction continues to do reads, and the
260
- # transaction has not been terminated by Commit or Rollback. Long periods of
261
- # inactivity at the client may cause Cloud Spanner to release a transaction's
262
- # locks and abort it. Conceptually, a read-write transaction consists of zero or
263
- # more reads or SQL statements followed by Commit. At any time before Commit,
264
- # the client can send a Rollback request to abort the transaction. Semantics:
265
- # Cloud Spanner can commit the transaction if all read locks it acquired are
266
- # still valid at commit time, and it is able to acquire write locks for all
267
- # writes. Cloud Spanner can abort the transaction for any reason. If a commit
268
- # attempt returns `ABORTED`, Cloud Spanner guarantees that the transaction has
269
- # not modified any user data in Cloud Spanner. Unless the transaction commits,
270
- # Cloud Spanner makes no guarantees about how long the transaction's locks were
271
- # held for. It is an error to use Cloud Spanner locks for any sort of mutual
272
- # exclusion other than between Cloud Spanner transactions themselves. Retrying
273
- # aborted transactions: When a transaction aborts, the application can choose to
274
- # retry the whole transaction again. To maximize the chances of successfully
275
- # committing the retry, the client should execute the retry in the same session
276
- # as the original attempt. The original session's lock priority increases with
277
- # each consecutive abort, meaning that each attempt has a slightly better chance
278
- # of success than the previous. Under some circumstances (for example, many
279
- # transactions attempting to modify the same row(s)), a transaction can abort
280
- # many times in a short period before successfully committing. Thus, it is not a
281
- # good idea to cap the number of retries a transaction can attempt; instead, it
282
- # is better to limit the total amount of time spent retrying. Idle transactions:
283
- # A transaction is considered idle if it has no outstanding reads or SQL queries
284
- # and has not started a read or SQL query within the last 10 seconds. Idle
285
- # transactions can be aborted by Cloud Spanner so that they don't hold on to
286
- # locks indefinitely. If an idle transaction is aborted, the commit will fail
287
- # with error `ABORTED`. If this behavior is undesirable, periodically executing
288
- # a simple SQL query in the transaction (for example, `SELECT 1`) prevents the
289
- # transaction from becoming idle. Snapshot read-only transactions: Snapshot read-
290
- # only transactions provides a simpler method than locking read-write
291
- # transactions for doing several consistent reads. However, this type of
292
- # transaction does not support writes. Snapshot transactions do not take locks.
293
- # Instead, they work by choosing a Cloud Spanner timestamp, then executing all
294
- # reads at that timestamp. Since they do not acquire locks, they do not block
295
- # concurrent read-write transactions. Unlike locking read-write transactions,
296
- # snapshot read-only transactions never abort. They can fail if the chosen read
297
- # timestamp is garbage collected; however, the default garbage collection policy
298
- # is generous enough that most applications do not need to worry about this in
299
- # practice. Snapshot read-only transactions do not need to call Commit or
300
- # Rollback (and in fact are not permitted to do so). To execute a snapshot
301
- # transaction, the client specifies a timestamp bound, which tells Cloud Spanner
302
- # how to choose a read timestamp. The types of timestamp bound are: - Strong (
303
- # the default). - Bounded staleness. - Exact staleness. If the Cloud Spanner
304
- # database to be read is geographically distributed, stale read-only
305
- # transactions can execute more quickly than strong or read-write transactions,
306
- # because they are able to execute far from the leader replica. Each type of
307
- # timestamp bound is discussed in detail below. Strong: Strong reads are
308
- # guaranteed to see the effects of all transactions that have committed before
309
- # the start of the read. Furthermore, all rows yielded by a single read are
310
- # consistent with each other -- if any part of the read observes a transaction,
311
- # all parts of the read see the transaction. Strong reads are not repeatable:
312
- # two consecutive strong read-only transactions might return inconsistent
313
- # results if there are concurrent writes. If consistency across reads is
314
- # required, the reads should be executed within a transaction or at an exact
315
- # read timestamp. See TransactionOptions.ReadOnly.strong. Exact staleness: These
316
- # timestamp bounds execute reads at a user-specified timestamp. Reads at a
317
- # timestamp are guaranteed to see a consistent prefix of the global transaction
318
- # history: they observe modifications done by all transactions with a commit
319
- # timestamp less than or equal to the read timestamp, and observe none of the
320
- # modifications done by transactions with a larger commit timestamp. They will
321
- # block until all conflicting transactions that may be assigned commit
322
- # timestamps <= the read timestamp have finished. The timestamp can either be
323
- # expressed as an absolute Cloud Spanner commit timestamp or a staleness
324
- # relative to the current time. These modes do not require a "negotiation phase"
325
- # to pick a timestamp. As a result, they execute slightly faster than the
326
- # equivalent boundedly stale concurrency modes. On the other hand, boundedly
327
- # stale reads usually return fresher results. See TransactionOptions.ReadOnly.
328
- # read_timestamp and TransactionOptions.ReadOnly.exact_staleness. Bounded
329
- # staleness: Bounded staleness modes allow Cloud Spanner to pick the read
330
- # timestamp, subject to a user-provided staleness bound. Cloud Spanner chooses
331
- # the newest timestamp within the staleness bound that allows execution of the
332
- # reads at the closest available replica without blocking. All rows yielded are
333
- # consistent with each other -- if any part of the read observes a transaction,
334
- # all parts of the read see the transaction. Boundedly stale reads are not
335
- # repeatable: two stale reads, even if they use the same staleness bound, can
336
- # execute at different timestamps and thus return inconsistent results.
337
- # Boundedly stale reads execute in two phases: the first phase negotiates a
338
- # timestamp among all replicas needed to serve the read. In the second phase,
339
- # reads are executed at the negotiated timestamp. As a result of the two phase
340
- # execution, bounded staleness reads are usually a little slower than comparable
341
- # exact staleness reads. However, they are typically able to return fresher
342
- # results, and are more likely to execute at the closest replica. Because the
343
- # timestamp negotiation requires up-front knowledge of which rows will be read,
344
- # it can only be used with single-use read-only transactions. See
345
- # TransactionOptions.ReadOnly.max_staleness and TransactionOptions.ReadOnly.
346
- # min_read_timestamp. Old read timestamps and garbage collection: Cloud Spanner
347
- # continuously garbage collects deleted and overwritten data in the background
348
- # to reclaim storage space. This process is known as "version GC". By default,
349
- # version GC reclaims versions after they are one hour old. Because of this,
350
- # Cloud Spanner cannot perform reads at read timestamps more than one hour in
351
- # the past. This restriction also applies to in-progress reads and/or SQL
352
- # queries whose timestamp become too old while executing. Reads and SQL queries
353
- # with too-old read timestamps fail with the error `FAILED_PRECONDITION`. You
354
- # can configure and extend the `VERSION_RETENTION_PERIOD` of a database up to a
355
- # period as long as one week, which allows Cloud Spanner to perform reads up to
356
- # one week in the past. Partitioned DML transactions: Partitioned DML
357
- # transactions are used to execute DML statements with a different execution
358
- # strategy that provides different, and often better, scalability properties for
359
- # large, table-wide operations than DML in a ReadWrite transaction. Smaller
360
- # scoped statements, such as an OLTP workload, should prefer using ReadWrite
361
- # transactions. Partitioned DML partitions the keyspace and runs the DML
362
- # statement on each partition in separate, internal transactions. These
363
- # transactions commit automatically when complete, and run independently from
364
- # one another. To reduce lock contention, this execution strategy only acquires
365
- # read locks on rows that match the WHERE clause of the statement. Additionally,
366
- # the smaller per-partition transactions hold locks for less time. That said,
367
- # Partitioned DML is not a drop-in replacement for standard DML used in
368
- # ReadWrite transactions. - The DML statement must be fully-partitionable.
369
- # Specifically, the statement must be expressible as the union of many
370
- # statements which each access only a single row of the table. - The statement
371
- # is not applied atomically to all rows of the table. Rather, the statement is
372
- # applied atomically to partitions of the table, in independent transactions.
373
- # Secondary index rows are updated atomically with the base table rows. -
374
- # Partitioned DML does not guarantee exactly-once execution semantics against a
375
- # partition. The statement will be applied at least once to each partition. It
376
- # is strongly recommended that the DML statement should be idempotent to avoid
377
- # unexpected results. For instance, it is potentially dangerous to run a
378
- # statement such as `UPDATE table SET column = column + 1` as it could be run
379
- # multiple times against some rows. - The partitions are committed automatically
380
- # - there is no support for Commit or Rollback. If the call returns an error, or
381
- # if the client issuing the ExecuteSql call dies, it is possible that some rows
382
- # had the statement executed on them successfully. It is also possible that
383
- # statement was never executed against other rows. - Partitioned DML
384
- # transactions may only contain the execution of a single DML statement via
385
- # ExecuteSql or ExecuteStreamingSql. - If any error is encountered during the
386
- # execution of the partitioned DML operation (for instance, a UNIQUE INDEX
387
- # violation, division by zero, or a value that cannot be stored due to schema
388
- # constraints), then the operation is stopped at that point and an error is
389
- # returned. It is possible that at this point, some partitions have been
231
+ # In addition, if TransactionOptions.read_only.return_read_timestamp is set to
232
+ # true, a special value of 2^63 - 2 will be returned in the Transaction message
233
+ # that describes the transaction, instead of a valid read timestamp. This
234
+ # special value should be discarded and not used for any subsequent queries.
235
+ # Please see https://cloud.google.com/spanner/docs/change-streams for more
236
+ # details on how to query the change stream TVFs. Partitioned DML transactions:
237
+ # Partitioned DML transactions are used to execute DML statements with a
238
+ # different execution strategy that provides different, and often better,
239
+ # scalability properties for large, table-wide operations than DML in a
240
+ # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
241
+ # should prefer using ReadWrite transactions. Partitioned DML partitions the
242
+ # keyspace and runs the DML statement on each partition in separate, internal
243
+ # transactions. These transactions commit automatically when complete, and run
244
+ # independently from one another. To reduce lock contention, this execution
245
+ # strategy only acquires read locks on rows that match the WHERE clause of the
246
+ # statement. Additionally, the smaller per-partition transactions hold locks for
247
+ # less time. That said, Partitioned DML is not a drop-in replacement for
248
+ # standard DML used in ReadWrite transactions. - The DML statement must be fully-
249
+ # partitionable. Specifically, the statement must be expressible as the union of
250
+ # many statements which each access only a single row of the table. - The
251
+ # statement is not applied atomically to all rows of the table. Rather, the
252
+ # statement is applied atomically to partitions of the table, in independent
253
+ # transactions. Secondary index rows are updated atomically with the base table
254
+ # rows. - Partitioned DML does not guarantee exactly-once execution semantics
255
+ # against a partition. The statement will be applied at least once to each
256
+ # partition. It is strongly recommended that the DML statement should be
257
+ # idempotent to avoid unexpected results. For instance, it is potentially
258
+ # dangerous to run a statement such as `UPDATE table SET column = column + 1` as
259
+ # it could be run multiple times against some rows. - The partitions are
260
+ # committed automatically - there is no support for Commit or Rollback. If the
261
+ # call returns an error, or if the client issuing the ExecuteSql call dies, it
262
+ # is possible that some rows had the statement executed on them successfully. It
263
+ # is also possible that statement was never executed against other rows. -
264
+ # Partitioned DML transactions may only contain the execution of a single DML
265
+ # statement via ExecuteSql or ExecuteStreamingSql. - If any error is encountered
266
+ # during the execution of the partitioned DML operation (for instance, a UNIQUE
267
+ # INDEX violation, division by zero, or a value that cannot be stored due to
268
+ # schema constraints), then the operation is stopped at that point and an error
269
+ # is returned. It is possible that at this point, some partitions have been
390
270
  # committed (or even committed multiple times), and other partitions have not
391
271
  # been run at all. Given the above, Partitioned DML is good fit for large,
392
272
  # database-wide, operations that are idempotent, such as deleting old rows from
@@ -543,165 +423,45 @@ module Google
543
423
  attr_accessor :return_commit_stats
544
424
  alias_method :return_commit_stats?, :return_commit_stats
545
425
 
546
- # Transactions: Each session can have at most one active transaction at a time (
547
- # note that standalone reads and queries use a transaction internally and do
548
- # count towards the one transaction limit). After the active transaction is
549
- # completed, the session can immediately be re-used for the next transaction. It
550
- # is not necessary to create a new session for each transaction. Transaction
551
- # modes: Cloud Spanner supports three transaction modes: 1. Locking read-write.
552
- # This type of transaction is the only way to write data into Cloud Spanner.
553
- # These transactions rely on pessimistic locking and, if necessary, two-phase
554
- # commit. Locking read-write transactions may abort, requiring the application
555
- # to retry. 2. Snapshot read-only. This transaction type provides guaranteed
556
- # consistency across several reads, but does not allow writes. Snapshot read-
557
- # only transactions can be configured to read at timestamps in the past.
558
- # Snapshot read-only transactions do not need to be committed. 3. Partitioned
559
- # DML. This type of transaction is used to execute a single Partitioned DML
560
- # statement. Partitioned DML partitions the key space and runs the DML statement
561
- # over each partition in parallel using separate, internal transactions that
562
- # commit independently. Partitioned DML transactions do not need to be committed.
563
- # For transactions that only read, snapshot read-only transactions provide
564
- # simpler semantics and are almost always faster. In particular, read-only
565
- # transactions do not take locks, so they do not conflict with read-write
566
- # transactions. As a consequence of not taking locks, they also do not abort, so
567
- # retry loops are not needed. Transactions may only read-write data in a single
568
- # database. They may, however, read-write data in different tables within that
569
- # database. Locking read-write transactions: Locking transactions may be used to
570
- # atomically read-modify-write data anywhere in a database. This type of
571
- # transaction is externally consistent. Clients should attempt to minimize the
572
- # amount of time a transaction is active. Faster transactions commit with higher
573
- # probability and cause less contention. Cloud Spanner attempts to keep read
574
- # locks active as long as the transaction continues to do reads, and the
575
- # transaction has not been terminated by Commit or Rollback. Long periods of
576
- # inactivity at the client may cause Cloud Spanner to release a transaction's
577
- # locks and abort it. Conceptually, a read-write transaction consists of zero or
578
- # more reads or SQL statements followed by Commit. At any time before Commit,
579
- # the client can send a Rollback request to abort the transaction. Semantics:
580
- # Cloud Spanner can commit the transaction if all read locks it acquired are
581
- # still valid at commit time, and it is able to acquire write locks for all
582
- # writes. Cloud Spanner can abort the transaction for any reason. If a commit
583
- # attempt returns `ABORTED`, Cloud Spanner guarantees that the transaction has
584
- # not modified any user data in Cloud Spanner. Unless the transaction commits,
585
- # Cloud Spanner makes no guarantees about how long the transaction's locks were
586
- # held for. It is an error to use Cloud Spanner locks for any sort of mutual
587
- # exclusion other than between Cloud Spanner transactions themselves. Retrying
588
- # aborted transactions: When a transaction aborts, the application can choose to
589
- # retry the whole transaction again. To maximize the chances of successfully
590
- # committing the retry, the client should execute the retry in the same session
591
- # as the original attempt. The original session's lock priority increases with
592
- # each consecutive abort, meaning that each attempt has a slightly better chance
593
- # of success than the previous. Under some circumstances (for example, many
594
- # transactions attempting to modify the same row(s)), a transaction can abort
595
- # many times in a short period before successfully committing. Thus, it is not a
596
- # good idea to cap the number of retries a transaction can attempt; instead, it
597
- # is better to limit the total amount of time spent retrying. Idle transactions:
598
- # A transaction is considered idle if it has no outstanding reads or SQL queries
599
- # and has not started a read or SQL query within the last 10 seconds. Idle
600
- # transactions can be aborted by Cloud Spanner so that they don't hold on to
601
- # locks indefinitely. If an idle transaction is aborted, the commit will fail
602
- # with error `ABORTED`. If this behavior is undesirable, periodically executing
603
- # a simple SQL query in the transaction (for example, `SELECT 1`) prevents the
604
- # transaction from becoming idle. Snapshot read-only transactions: Snapshot read-
605
- # only transactions provides a simpler method than locking read-write
606
- # transactions for doing several consistent reads. However, this type of
607
- # transaction does not support writes. Snapshot transactions do not take locks.
608
- # Instead, they work by choosing a Cloud Spanner timestamp, then executing all
609
- # reads at that timestamp. Since they do not acquire locks, they do not block
610
- # concurrent read-write transactions. Unlike locking read-write transactions,
611
- # snapshot read-only transactions never abort. They can fail if the chosen read
612
- # timestamp is garbage collected; however, the default garbage collection policy
613
- # is generous enough that most applications do not need to worry about this in
614
- # practice. Snapshot read-only transactions do not need to call Commit or
615
- # Rollback (and in fact are not permitted to do so). To execute a snapshot
616
- # transaction, the client specifies a timestamp bound, which tells Cloud Spanner
617
- # how to choose a read timestamp. The types of timestamp bound are: - Strong (
618
- # the default). - Bounded staleness. - Exact staleness. If the Cloud Spanner
619
- # database to be read is geographically distributed, stale read-only
620
- # transactions can execute more quickly than strong or read-write transactions,
621
- # because they are able to execute far from the leader replica. Each type of
622
- # timestamp bound is discussed in detail below. Strong: Strong reads are
623
- # guaranteed to see the effects of all transactions that have committed before
624
- # the start of the read. Furthermore, all rows yielded by a single read are
625
- # consistent with each other -- if any part of the read observes a transaction,
626
- # all parts of the read see the transaction. Strong reads are not repeatable:
627
- # two consecutive strong read-only transactions might return inconsistent
628
- # results if there are concurrent writes. If consistency across reads is
629
- # required, the reads should be executed within a transaction or at an exact
630
- # read timestamp. See TransactionOptions.ReadOnly.strong. Exact staleness: These
631
- # timestamp bounds execute reads at a user-specified timestamp. Reads at a
632
- # timestamp are guaranteed to see a consistent prefix of the global transaction
633
- # history: they observe modifications done by all transactions with a commit
634
- # timestamp less than or equal to the read timestamp, and observe none of the
635
- # modifications done by transactions with a larger commit timestamp. They will
636
- # block until all conflicting transactions that may be assigned commit
637
- # timestamps <= the read timestamp have finished. The timestamp can either be
638
- # expressed as an absolute Cloud Spanner commit timestamp or a staleness
639
- # relative to the current time. These modes do not require a "negotiation phase"
640
- # to pick a timestamp. As a result, they execute slightly faster than the
641
- # equivalent boundedly stale concurrency modes. On the other hand, boundedly
642
- # stale reads usually return fresher results. See TransactionOptions.ReadOnly.
643
- # read_timestamp and TransactionOptions.ReadOnly.exact_staleness. Bounded
644
- # staleness: Bounded staleness modes allow Cloud Spanner to pick the read
645
- # timestamp, subject to a user-provided staleness bound. Cloud Spanner chooses
646
- # the newest timestamp within the staleness bound that allows execution of the
647
- # reads at the closest available replica without blocking. All rows yielded are
648
- # consistent with each other -- if any part of the read observes a transaction,
649
- # all parts of the read see the transaction. Boundedly stale reads are not
650
- # repeatable: two stale reads, even if they use the same staleness bound, can
651
- # execute at different timestamps and thus return inconsistent results.
652
- # Boundedly stale reads execute in two phases: the first phase negotiates a
653
- # timestamp among all replicas needed to serve the read. In the second phase,
654
- # reads are executed at the negotiated timestamp. As a result of the two phase
655
- # execution, bounded staleness reads are usually a little slower than comparable
656
- # exact staleness reads. However, they are typically able to return fresher
657
- # results, and are more likely to execute at the closest replica. Because the
658
- # timestamp negotiation requires up-front knowledge of which rows will be read,
659
- # it can only be used with single-use read-only transactions. See
660
- # TransactionOptions.ReadOnly.max_staleness and TransactionOptions.ReadOnly.
661
- # min_read_timestamp. Old read timestamps and garbage collection: Cloud Spanner
662
- # continuously garbage collects deleted and overwritten data in the background
663
- # to reclaim storage space. This process is known as "version GC". By default,
664
- # version GC reclaims versions after they are one hour old. Because of this,
665
- # Cloud Spanner cannot perform reads at read timestamps more than one hour in
666
- # the past. This restriction also applies to in-progress reads and/or SQL
667
- # queries whose timestamp become too old while executing. Reads and SQL queries
668
- # with too-old read timestamps fail with the error `FAILED_PRECONDITION`. You
669
- # can configure and extend the `VERSION_RETENTION_PERIOD` of a database up to a
670
- # period as long as one week, which allows Cloud Spanner to perform reads up to
671
- # one week in the past. Partitioned DML transactions: Partitioned DML
672
- # transactions are used to execute DML statements with a different execution
673
- # strategy that provides different, and often better, scalability properties for
674
- # large, table-wide operations than DML in a ReadWrite transaction. Smaller
675
- # scoped statements, such as an OLTP workload, should prefer using ReadWrite
676
- # transactions. Partitioned DML partitions the keyspace and runs the DML
677
- # statement on each partition in separate, internal transactions. These
678
- # transactions commit automatically when complete, and run independently from
679
- # one another. To reduce lock contention, this execution strategy only acquires
680
- # read locks on rows that match the WHERE clause of the statement. Additionally,
681
- # the smaller per-partition transactions hold locks for less time. That said,
682
- # Partitioned DML is not a drop-in replacement for standard DML used in
683
- # ReadWrite transactions. - The DML statement must be fully-partitionable.
684
- # Specifically, the statement must be expressible as the union of many
685
- # statements which each access only a single row of the table. - The statement
686
- # is not applied atomically to all rows of the table. Rather, the statement is
687
- # applied atomically to partitions of the table, in independent transactions.
688
- # Secondary index rows are updated atomically with the base table rows. -
689
- # Partitioned DML does not guarantee exactly-once execution semantics against a
690
- # partition. The statement will be applied at least once to each partition. It
691
- # is strongly recommended that the DML statement should be idempotent to avoid
692
- # unexpected results. For instance, it is potentially dangerous to run a
693
- # statement such as `UPDATE table SET column = column + 1` as it could be run
694
- # multiple times against some rows. - The partitions are committed automatically
695
- # - there is no support for Commit or Rollback. If the call returns an error, or
696
- # if the client issuing the ExecuteSql call dies, it is possible that some rows
697
- # had the statement executed on them successfully. It is also possible that
698
- # statement was never executed against other rows. - Partitioned DML
699
- # transactions may only contain the execution of a single DML statement via
700
- # ExecuteSql or ExecuteStreamingSql. - If any error is encountered during the
701
- # execution of the partitioned DML operation (for instance, a UNIQUE INDEX
702
- # violation, division by zero, or a value that cannot be stored due to schema
703
- # constraints), then the operation is stopped at that point and an error is
704
- # returned. It is possible that at this point, some partitions have been
426
+ # In addition, if TransactionOptions.read_only.return_read_timestamp is set to
427
+ # true, a special value of 2^63 - 2 will be returned in the Transaction message
428
+ # that describes the transaction, instead of a valid read timestamp. This
429
+ # special value should be discarded and not used for any subsequent queries.
430
+ # Please see https://cloud.google.com/spanner/docs/change-streams for more
431
+ # details on how to query the change stream TVFs. Partitioned DML transactions:
432
+ # Partitioned DML transactions are used to execute DML statements with a
433
+ # different execution strategy that provides different, and often better,
434
+ # scalability properties for large, table-wide operations than DML in a
435
+ # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
436
+ # should prefer using ReadWrite transactions. Partitioned DML partitions the
437
+ # keyspace and runs the DML statement on each partition in separate, internal
438
+ # transactions. These transactions commit automatically when complete, and run
439
+ # independently from one another. To reduce lock contention, this execution
440
+ # strategy only acquires read locks on rows that match the WHERE clause of the
441
+ # statement. Additionally, the smaller per-partition transactions hold locks for
442
+ # less time. That said, Partitioned DML is not a drop-in replacement for
443
+ # standard DML used in ReadWrite transactions. - The DML statement must be fully-
444
+ # partitionable. Specifically, the statement must be expressible as the union of
445
+ # many statements which each access only a single row of the table. - The
446
+ # statement is not applied atomically to all rows of the table. Rather, the
447
+ # statement is applied atomically to partitions of the table, in independent
448
+ # transactions. Secondary index rows are updated atomically with the base table
449
+ # rows. - Partitioned DML does not guarantee exactly-once execution semantics
450
+ # against a partition. The statement will be applied at least once to each
451
+ # partition. It is strongly recommended that the DML statement should be
452
+ # idempotent to avoid unexpected results. For instance, it is potentially
453
+ # dangerous to run a statement such as `UPDATE table SET column = column + 1` as
454
+ # it could be run multiple times against some rows. - The partitions are
455
+ # committed automatically - there is no support for Commit or Rollback. If the
456
+ # call returns an error, or if the client issuing the ExecuteSql call dies, it
457
+ # is possible that some rows had the statement executed on them successfully. It
458
+ # is also possible that statement was never executed against other rows. -
459
+ # Partitioned DML transactions may only contain the execution of a single DML
460
+ # statement via ExecuteSql or ExecuteStreamingSql. - If any error is encountered
461
+ # during the execution of the partitioned DML operation (for instance, a UNIQUE
462
+ # INDEX violation, division by zero, or a value that cannot be stored due to
463
+ # schema constraints), then the operation is stopped at that point and an error
464
+ # is returned. It is possible that at this point, some partitions have been
705
465
  # committed (or even committed multiple times), and other partitions have not
706
466
  # been run at all. Given the above, Partitioned DML is good fit for large,
707
467
  # database-wide, operations that are idempotent, such as deleting old rows from
@@ -1221,6 +981,28 @@ module Google
1221
981
  end
1222
982
  end
1223
983
 
984
+ # A Cloud Spanner database role.
985
+ class DatabaseRole
986
+ include Google::Apis::Core::Hashable
987
+
988
+ # Required. The name of the database role. Values are of the form `projects//
989
+ # instances//databases//databaseRoles/ `role``, where `` is as specified in the `
990
+ # CREATE ROLE` DDL statement. This name can be passed to Get/Set IAMPolicy
991
+ # methods to identify the database role.
992
+ # Corresponds to the JSON property `name`
993
+ # @return [String]
994
+ attr_accessor :name
995
+
996
+ def initialize(**args)
997
+ update!(**args)
998
+ end
999
+
1000
+ # Update properties of this object
1001
+ def update!(**args)
1002
+ @name = args[:name] if args.key?(:name)
1003
+ end
1004
+ end
1005
+
1224
1006
  # Arguments to delete operations.
1225
1007
  class Delete
1226
1008
  include Google::Apis::Core::Hashable
@@ -2235,6 +2017,32 @@ module Google
2235
2017
  end
2236
2018
  end
2237
2019
 
2020
+ # The response for ListDatabaseRoles.
2021
+ class ListDatabaseRolesResponse
2022
+ include Google::Apis::Core::Hashable
2023
+
2024
+ # Database roles that matched the request.
2025
+ # Corresponds to the JSON property `databaseRoles`
2026
+ # @return [Array<Google::Apis::SpannerV1::DatabaseRole>]
2027
+ attr_accessor :database_roles
2028
+
2029
+ # `next_page_token` can be sent in a subsequent ListDatabaseRoles call to fetch
2030
+ # more of the matching roles.
2031
+ # Corresponds to the JSON property `nextPageToken`
2032
+ # @return [String]
2033
+ attr_accessor :next_page_token
2034
+
2035
+ def initialize(**args)
2036
+ update!(**args)
2037
+ end
2038
+
2039
+ # Update properties of this object
2040
+ def update!(**args)
2041
+ @database_roles = args[:database_roles] if args.key?(:database_roles)
2042
+ @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
2043
+ end
2044
+ end
2045
+
2238
2046
  # The response for ListDatabases.
2239
2047
  class ListDatabasesResponse
2240
2048
  include Google::Apis::Core::Hashable
@@ -3921,6 +3729,11 @@ module Google
3921
3729
  # @return [String]
3922
3730
  attr_accessor :create_time
3923
3731
 
3732
+ # The database role which created this session.
3733
+ # Corresponds to the JSON property `creatorRole`
3734
+ # @return [String]
3735
+ attr_accessor :creator_role
3736
+
3924
3737
  # The labels for the session. * Label keys must be between 1 and 63 characters
3925
3738
  # long and must conform to the following regular expression: `[a-z]([-a-z0-9]*[a-
3926
3739
  # z0-9])?`. * Label values must be between 0 and 63 characters long and must
@@ -3944,6 +3757,7 @@ module Google
3944
3757
  def update!(**args)
3945
3758
  @approximate_last_use_time = args[:approximate_last_use_time] if args.key?(:approximate_last_use_time)
3946
3759
  @create_time = args[:create_time] if args.key?(:create_time)
3760
+ @creator_role = args[:creator_role] if args.key?(:creator_role)
3947
3761
  @labels = args[:labels] if args.key?(:labels)
3948
3762
  @name = args[:name] if args.key?(:name)
3949
3763
  end
@@ -4196,165 +4010,45 @@ module Google
4196
4010
  end
4197
4011
  end
4198
4012
 
4199
- # Transactions: Each session can have at most one active transaction at a time (
4200
- # note that standalone reads and queries use a transaction internally and do
4201
- # count towards the one transaction limit). After the active transaction is
4202
- # completed, the session can immediately be re-used for the next transaction. It
4203
- # is not necessary to create a new session for each transaction. Transaction
4204
- # modes: Cloud Spanner supports three transaction modes: 1. Locking read-write.
4205
- # This type of transaction is the only way to write data into Cloud Spanner.
4206
- # These transactions rely on pessimistic locking and, if necessary, two-phase
4207
- # commit. Locking read-write transactions may abort, requiring the application
4208
- # to retry. 2. Snapshot read-only. This transaction type provides guaranteed
4209
- # consistency across several reads, but does not allow writes. Snapshot read-
4210
- # only transactions can be configured to read at timestamps in the past.
4211
- # Snapshot read-only transactions do not need to be committed. 3. Partitioned
4212
- # DML. This type of transaction is used to execute a single Partitioned DML
4213
- # statement. Partitioned DML partitions the key space and runs the DML statement
4214
- # over each partition in parallel using separate, internal transactions that
4215
- # commit independently. Partitioned DML transactions do not need to be committed.
4216
- # For transactions that only read, snapshot read-only transactions provide
4217
- # simpler semantics and are almost always faster. In particular, read-only
4218
- # transactions do not take locks, so they do not conflict with read-write
4219
- # transactions. As a consequence of not taking locks, they also do not abort, so
4220
- # retry loops are not needed. Transactions may only read-write data in a single
4221
- # database. They may, however, read-write data in different tables within that
4222
- # database. Locking read-write transactions: Locking transactions may be used to
4223
- # atomically read-modify-write data anywhere in a database. This type of
4224
- # transaction is externally consistent. Clients should attempt to minimize the
4225
- # amount of time a transaction is active. Faster transactions commit with higher
4226
- # probability and cause less contention. Cloud Spanner attempts to keep read
4227
- # locks active as long as the transaction continues to do reads, and the
4228
- # transaction has not been terminated by Commit or Rollback. Long periods of
4229
- # inactivity at the client may cause Cloud Spanner to release a transaction's
4230
- # locks and abort it. Conceptually, a read-write transaction consists of zero or
4231
- # more reads or SQL statements followed by Commit. At any time before Commit,
4232
- # the client can send a Rollback request to abort the transaction. Semantics:
4233
- # Cloud Spanner can commit the transaction if all read locks it acquired are
4234
- # still valid at commit time, and it is able to acquire write locks for all
4235
- # writes. Cloud Spanner can abort the transaction for any reason. If a commit
4236
- # attempt returns `ABORTED`, Cloud Spanner guarantees that the transaction has
4237
- # not modified any user data in Cloud Spanner. Unless the transaction commits,
4238
- # Cloud Spanner makes no guarantees about how long the transaction's locks were
4239
- # held for. It is an error to use Cloud Spanner locks for any sort of mutual
4240
- # exclusion other than between Cloud Spanner transactions themselves. Retrying
4241
- # aborted transactions: When a transaction aborts, the application can choose to
4242
- # retry the whole transaction again. To maximize the chances of successfully
4243
- # committing the retry, the client should execute the retry in the same session
4244
- # as the original attempt. The original session's lock priority increases with
4245
- # each consecutive abort, meaning that each attempt has a slightly better chance
4246
- # of success than the previous. Under some circumstances (for example, many
4247
- # transactions attempting to modify the same row(s)), a transaction can abort
4248
- # many times in a short period before successfully committing. Thus, it is not a
4249
- # good idea to cap the number of retries a transaction can attempt; instead, it
4250
- # is better to limit the total amount of time spent retrying. Idle transactions:
4251
- # A transaction is considered idle if it has no outstanding reads or SQL queries
4252
- # and has not started a read or SQL query within the last 10 seconds. Idle
4253
- # transactions can be aborted by Cloud Spanner so that they don't hold on to
4254
- # locks indefinitely. If an idle transaction is aborted, the commit will fail
4255
- # with error `ABORTED`. If this behavior is undesirable, periodically executing
4256
- # a simple SQL query in the transaction (for example, `SELECT 1`) prevents the
4257
- # transaction from becoming idle. Snapshot read-only transactions: Snapshot read-
4258
- # only transactions provides a simpler method than locking read-write
4259
- # transactions for doing several consistent reads. However, this type of
4260
- # transaction does not support writes. Snapshot transactions do not take locks.
4261
- # Instead, they work by choosing a Cloud Spanner timestamp, then executing all
4262
- # reads at that timestamp. Since they do not acquire locks, they do not block
4263
- # concurrent read-write transactions. Unlike locking read-write transactions,
4264
- # snapshot read-only transactions never abort. They can fail if the chosen read
4265
- # timestamp is garbage collected; however, the default garbage collection policy
4266
- # is generous enough that most applications do not need to worry about this in
4267
- # practice. Snapshot read-only transactions do not need to call Commit or
4268
- # Rollback (and in fact are not permitted to do so). To execute a snapshot
4269
- # transaction, the client specifies a timestamp bound, which tells Cloud Spanner
4270
- # how to choose a read timestamp. The types of timestamp bound are: - Strong (
4271
- # the default). - Bounded staleness. - Exact staleness. If the Cloud Spanner
4272
- # database to be read is geographically distributed, stale read-only
4273
- # transactions can execute more quickly than strong or read-write transactions,
4274
- # because they are able to execute far from the leader replica. Each type of
4275
- # timestamp bound is discussed in detail below. Strong: Strong reads are
4276
- # guaranteed to see the effects of all transactions that have committed before
4277
- # the start of the read. Furthermore, all rows yielded by a single read are
4278
- # consistent with each other -- if any part of the read observes a transaction,
4279
- # all parts of the read see the transaction. Strong reads are not repeatable:
4280
- # two consecutive strong read-only transactions might return inconsistent
4281
- # results if there are concurrent writes. If consistency across reads is
4282
- # required, the reads should be executed within a transaction or at an exact
4283
- # read timestamp. See TransactionOptions.ReadOnly.strong. Exact staleness: These
4284
- # timestamp bounds execute reads at a user-specified timestamp. Reads at a
4285
- # timestamp are guaranteed to see a consistent prefix of the global transaction
4286
- # history: they observe modifications done by all transactions with a commit
4287
- # timestamp less than or equal to the read timestamp, and observe none of the
4288
- # modifications done by transactions with a larger commit timestamp. They will
4289
- # block until all conflicting transactions that may be assigned commit
4290
- # timestamps <= the read timestamp have finished. The timestamp can either be
4291
- # expressed as an absolute Cloud Spanner commit timestamp or a staleness
4292
- # relative to the current time. These modes do not require a "negotiation phase"
4293
- # to pick a timestamp. As a result, they execute slightly faster than the
4294
- # equivalent boundedly stale concurrency modes. On the other hand, boundedly
4295
- # stale reads usually return fresher results. See TransactionOptions.ReadOnly.
4296
- # read_timestamp and TransactionOptions.ReadOnly.exact_staleness. Bounded
4297
- # staleness: Bounded staleness modes allow Cloud Spanner to pick the read
4298
- # timestamp, subject to a user-provided staleness bound. Cloud Spanner chooses
4299
- # the newest timestamp within the staleness bound that allows execution of the
4300
- # reads at the closest available replica without blocking. All rows yielded are
4301
- # consistent with each other -- if any part of the read observes a transaction,
4302
- # all parts of the read see the transaction. Boundedly stale reads are not
4303
- # repeatable: two stale reads, even if they use the same staleness bound, can
4304
- # execute at different timestamps and thus return inconsistent results.
4305
- # Boundedly stale reads execute in two phases: the first phase negotiates a
4306
- # timestamp among all replicas needed to serve the read. In the second phase,
4307
- # reads are executed at the negotiated timestamp. As a result of the two phase
4308
- # execution, bounded staleness reads are usually a little slower than comparable
4309
- # exact staleness reads. However, they are typically able to return fresher
4310
- # results, and are more likely to execute at the closest replica. Because the
4311
- # timestamp negotiation requires up-front knowledge of which rows will be read,
4312
- # it can only be used with single-use read-only transactions. See
4313
- # TransactionOptions.ReadOnly.max_staleness and TransactionOptions.ReadOnly.
4314
- # min_read_timestamp. Old read timestamps and garbage collection: Cloud Spanner
4315
- # continuously garbage collects deleted and overwritten data in the background
4316
- # to reclaim storage space. This process is known as "version GC". By default,
4317
- # version GC reclaims versions after they are one hour old. Because of this,
4318
- # Cloud Spanner cannot perform reads at read timestamps more than one hour in
4319
- # the past. This restriction also applies to in-progress reads and/or SQL
4320
- # queries whose timestamp become too old while executing. Reads and SQL queries
4321
- # with too-old read timestamps fail with the error `FAILED_PRECONDITION`. You
4322
- # can configure and extend the `VERSION_RETENTION_PERIOD` of a database up to a
4323
- # period as long as one week, which allows Cloud Spanner to perform reads up to
4324
- # one week in the past. Partitioned DML transactions: Partitioned DML
4325
- # transactions are used to execute DML statements with a different execution
4326
- # strategy that provides different, and often better, scalability properties for
4327
- # large, table-wide operations than DML in a ReadWrite transaction. Smaller
4328
- # scoped statements, such as an OLTP workload, should prefer using ReadWrite
4329
- # transactions. Partitioned DML partitions the keyspace and runs the DML
4330
- # statement on each partition in separate, internal transactions. These
4331
- # transactions commit automatically when complete, and run independently from
4332
- # one another. To reduce lock contention, this execution strategy only acquires
4333
- # read locks on rows that match the WHERE clause of the statement. Additionally,
4334
- # the smaller per-partition transactions hold locks for less time. That said,
4335
- # Partitioned DML is not a drop-in replacement for standard DML used in
4336
- # ReadWrite transactions. - The DML statement must be fully-partitionable.
4337
- # Specifically, the statement must be expressible as the union of many
4338
- # statements which each access only a single row of the table. - The statement
4339
- # is not applied atomically to all rows of the table. Rather, the statement is
4340
- # applied atomically to partitions of the table, in independent transactions.
4341
- # Secondary index rows are updated atomically with the base table rows. -
4342
- # Partitioned DML does not guarantee exactly-once execution semantics against a
4343
- # partition. The statement will be applied at least once to each partition. It
4344
- # is strongly recommended that the DML statement should be idempotent to avoid
4345
- # unexpected results. For instance, it is potentially dangerous to run a
4346
- # statement such as `UPDATE table SET column = column + 1` as it could be run
4347
- # multiple times against some rows. - The partitions are committed automatically
4348
- # - there is no support for Commit or Rollback. If the call returns an error, or
4349
- # if the client issuing the ExecuteSql call dies, it is possible that some rows
4350
- # had the statement executed on them successfully. It is also possible that
4351
- # statement was never executed against other rows. - Partitioned DML
4352
- # transactions may only contain the execution of a single DML statement via
4353
- # ExecuteSql or ExecuteStreamingSql. - If any error is encountered during the
4354
- # execution of the partitioned DML operation (for instance, a UNIQUE INDEX
4355
- # violation, division by zero, or a value that cannot be stored due to schema
4356
- # constraints), then the operation is stopped at that point and an error is
4357
- # returned. It is possible that at this point, some partitions have been
4013
+ # In addition, if TransactionOptions.read_only.return_read_timestamp is set to
4014
+ # true, a special value of 2^63 - 2 will be returned in the Transaction message
4015
+ # that describes the transaction, instead of a valid read timestamp. This
4016
+ # special value should be discarded and not used for any subsequent queries.
4017
+ # Please see https://cloud.google.com/spanner/docs/change-streams for more
4018
+ # details on how to query the change stream TVFs. Partitioned DML transactions:
4019
+ # Partitioned DML transactions are used to execute DML statements with a
4020
+ # different execution strategy that provides different, and often better,
4021
+ # scalability properties for large, table-wide operations than DML in a
4022
+ # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
4023
+ # should prefer using ReadWrite transactions. Partitioned DML partitions the
4024
+ # keyspace and runs the DML statement on each partition in separate, internal
4025
+ # transactions. These transactions commit automatically when complete, and run
4026
+ # independently from one another. To reduce lock contention, this execution
4027
+ # strategy only acquires read locks on rows that match the WHERE clause of the
4028
+ # statement. Additionally, the smaller per-partition transactions hold locks for
4029
+ # less time. That said, Partitioned DML is not a drop-in replacement for
4030
+ # standard DML used in ReadWrite transactions. - The DML statement must be fully-
4031
+ # partitionable. Specifically, the statement must be expressible as the union of
4032
+ # many statements which each access only a single row of the table. - The
4033
+ # statement is not applied atomically to all rows of the table. Rather, the
4034
+ # statement is applied atomically to partitions of the table, in independent
4035
+ # transactions. Secondary index rows are updated atomically with the base table
4036
+ # rows. - Partitioned DML does not guarantee exactly-once execution semantics
4037
+ # against a partition. The statement will be applied at least once to each
4038
+ # partition. It is strongly recommended that the DML statement should be
4039
+ # idempotent to avoid unexpected results. For instance, it is potentially
4040
+ # dangerous to run a statement such as `UPDATE table SET column = column + 1` as
4041
+ # it could be run multiple times against some rows. - The partitions are
4042
+ # committed automatically - there is no support for Commit or Rollback. If the
4043
+ # call returns an error, or if the client issuing the ExecuteSql call dies, it
4044
+ # is possible that some rows had the statement executed on them successfully. It
4045
+ # is also possible that statement was never executed against other rows. -
4046
+ # Partitioned DML transactions may only contain the execution of a single DML
4047
+ # statement via ExecuteSql or ExecuteStreamingSql. - If any error is encountered
4048
+ # during the execution of the partitioned DML operation (for instance, a UNIQUE
4049
+ # INDEX violation, division by zero, or a value that cannot be stored due to
4050
+ # schema constraints), then the operation is stopped at that point and an error
4051
+ # is returned. It is possible that at this point, some partitions have been
4358
4052
  # committed (or even committed multiple times), and other partitions have not
4359
4053
  # been run at all. Given the above, Partitioned DML is good fit for large,
4360
4054
  # database-wide, operations that are idempotent, such as deleting old rows from
@@ -4395,165 +4089,45 @@ module Google
4395
4089
  class TransactionSelector
4396
4090
  include Google::Apis::Core::Hashable
4397
4091
 
4398
- # Transactions: Each session can have at most one active transaction at a time (
4399
- # note that standalone reads and queries use a transaction internally and do
4400
- # count towards the one transaction limit). After the active transaction is
4401
- # completed, the session can immediately be re-used for the next transaction. It
4402
- # is not necessary to create a new session for each transaction. Transaction
4403
- # modes: Cloud Spanner supports three transaction modes: 1. Locking read-write.
4404
- # This type of transaction is the only way to write data into Cloud Spanner.
4405
- # These transactions rely on pessimistic locking and, if necessary, two-phase
4406
- # commit. Locking read-write transactions may abort, requiring the application
4407
- # to retry. 2. Snapshot read-only. This transaction type provides guaranteed
4408
- # consistency across several reads, but does not allow writes. Snapshot read-
4409
- # only transactions can be configured to read at timestamps in the past.
4410
- # Snapshot read-only transactions do not need to be committed. 3. Partitioned
4411
- # DML. This type of transaction is used to execute a single Partitioned DML
4412
- # statement. Partitioned DML partitions the key space and runs the DML statement
4413
- # over each partition in parallel using separate, internal transactions that
4414
- # commit independently. Partitioned DML transactions do not need to be committed.
4415
- # For transactions that only read, snapshot read-only transactions provide
4416
- # simpler semantics and are almost always faster. In particular, read-only
4417
- # transactions do not take locks, so they do not conflict with read-write
4418
- # transactions. As a consequence of not taking locks, they also do not abort, so
4419
- # retry loops are not needed. Transactions may only read-write data in a single
4420
- # database. They may, however, read-write data in different tables within that
4421
- # database. Locking read-write transactions: Locking transactions may be used to
4422
- # atomically read-modify-write data anywhere in a database. This type of
4423
- # transaction is externally consistent. Clients should attempt to minimize the
4424
- # amount of time a transaction is active. Faster transactions commit with higher
4425
- # probability and cause less contention. Cloud Spanner attempts to keep read
4426
- # locks active as long as the transaction continues to do reads, and the
4427
- # transaction has not been terminated by Commit or Rollback. Long periods of
4428
- # inactivity at the client may cause Cloud Spanner to release a transaction's
4429
- # locks and abort it. Conceptually, a read-write transaction consists of zero or
4430
- # more reads or SQL statements followed by Commit. At any time before Commit,
4431
- # the client can send a Rollback request to abort the transaction. Semantics:
4432
- # Cloud Spanner can commit the transaction if all read locks it acquired are
4433
- # still valid at commit time, and it is able to acquire write locks for all
4434
- # writes. Cloud Spanner can abort the transaction for any reason. If a commit
4435
- # attempt returns `ABORTED`, Cloud Spanner guarantees that the transaction has
4436
- # not modified any user data in Cloud Spanner. Unless the transaction commits,
4437
- # Cloud Spanner makes no guarantees about how long the transaction's locks were
4438
- # held for. It is an error to use Cloud Spanner locks for any sort of mutual
4439
- # exclusion other than between Cloud Spanner transactions themselves. Retrying
4440
- # aborted transactions: When a transaction aborts, the application can choose to
4441
- # retry the whole transaction again. To maximize the chances of successfully
4442
- # committing the retry, the client should execute the retry in the same session
4443
- # as the original attempt. The original session's lock priority increases with
4444
- # each consecutive abort, meaning that each attempt has a slightly better chance
4445
- # of success than the previous. Under some circumstances (for example, many
4446
- # transactions attempting to modify the same row(s)), a transaction can abort
4447
- # many times in a short period before successfully committing. Thus, it is not a
4448
- # good idea to cap the number of retries a transaction can attempt; instead, it
4449
- # is better to limit the total amount of time spent retrying. Idle transactions:
4450
- # A transaction is considered idle if it has no outstanding reads or SQL queries
4451
- # and has not started a read or SQL query within the last 10 seconds. Idle
4452
- # transactions can be aborted by Cloud Spanner so that they don't hold on to
4453
- # locks indefinitely. If an idle transaction is aborted, the commit will fail
4454
- # with error `ABORTED`. If this behavior is undesirable, periodically executing
4455
- # a simple SQL query in the transaction (for example, `SELECT 1`) prevents the
4456
- # transaction from becoming idle. Snapshot read-only transactions: Snapshot read-
4457
- # only transactions provides a simpler method than locking read-write
4458
- # transactions for doing several consistent reads. However, this type of
4459
- # transaction does not support writes. Snapshot transactions do not take locks.
4460
- # Instead, they work by choosing a Cloud Spanner timestamp, then executing all
4461
- # reads at that timestamp. Since they do not acquire locks, they do not block
4462
- # concurrent read-write transactions. Unlike locking read-write transactions,
4463
- # snapshot read-only transactions never abort. They can fail if the chosen read
4464
- # timestamp is garbage collected; however, the default garbage collection policy
4465
- # is generous enough that most applications do not need to worry about this in
4466
- # practice. Snapshot read-only transactions do not need to call Commit or
4467
- # Rollback (and in fact are not permitted to do so). To execute a snapshot
4468
- # transaction, the client specifies a timestamp bound, which tells Cloud Spanner
4469
- # how to choose a read timestamp. The types of timestamp bound are: - Strong (
4470
- # the default). - Bounded staleness. - Exact staleness. If the Cloud Spanner
4471
- # database to be read is geographically distributed, stale read-only
4472
- # transactions can execute more quickly than strong or read-write transactions,
4473
- # because they are able to execute far from the leader replica. Each type of
4474
- # timestamp bound is discussed in detail below. Strong: Strong reads are
4475
- # guaranteed to see the effects of all transactions that have committed before
4476
- # the start of the read. Furthermore, all rows yielded by a single read are
4477
- # consistent with each other -- if any part of the read observes a transaction,
4478
- # all parts of the read see the transaction. Strong reads are not repeatable:
4479
- # two consecutive strong read-only transactions might return inconsistent
4480
- # results if there are concurrent writes. If consistency across reads is
4481
- # required, the reads should be executed within a transaction or at an exact
4482
- # read timestamp. See TransactionOptions.ReadOnly.strong. Exact staleness: These
4483
- # timestamp bounds execute reads at a user-specified timestamp. Reads at a
4484
- # timestamp are guaranteed to see a consistent prefix of the global transaction
4485
- # history: they observe modifications done by all transactions with a commit
4486
- # timestamp less than or equal to the read timestamp, and observe none of the
4487
- # modifications done by transactions with a larger commit timestamp. They will
4488
- # block until all conflicting transactions that may be assigned commit
4489
- # timestamps <= the read timestamp have finished. The timestamp can either be
4490
- # expressed as an absolute Cloud Spanner commit timestamp or a staleness
4491
- # relative to the current time. These modes do not require a "negotiation phase"
4492
- # to pick a timestamp. As a result, they execute slightly faster than the
4493
- # equivalent boundedly stale concurrency modes. On the other hand, boundedly
4494
- # stale reads usually return fresher results. See TransactionOptions.ReadOnly.
4495
- # read_timestamp and TransactionOptions.ReadOnly.exact_staleness. Bounded
4496
- # staleness: Bounded staleness modes allow Cloud Spanner to pick the read
4497
- # timestamp, subject to a user-provided staleness bound. Cloud Spanner chooses
4498
- # the newest timestamp within the staleness bound that allows execution of the
4499
- # reads at the closest available replica without blocking. All rows yielded are
4500
- # consistent with each other -- if any part of the read observes a transaction,
4501
- # all parts of the read see the transaction. Boundedly stale reads are not
4502
- # repeatable: two stale reads, even if they use the same staleness bound, can
4503
- # execute at different timestamps and thus return inconsistent results.
4504
- # Boundedly stale reads execute in two phases: the first phase negotiates a
4505
- # timestamp among all replicas needed to serve the read. In the second phase,
4506
- # reads are executed at the negotiated timestamp. As a result of the two phase
4507
- # execution, bounded staleness reads are usually a little slower than comparable
4508
- # exact staleness reads. However, they are typically able to return fresher
4509
- # results, and are more likely to execute at the closest replica. Because the
4510
- # timestamp negotiation requires up-front knowledge of which rows will be read,
4511
- # it can only be used with single-use read-only transactions. See
4512
- # TransactionOptions.ReadOnly.max_staleness and TransactionOptions.ReadOnly.
4513
- # min_read_timestamp. Old read timestamps and garbage collection: Cloud Spanner
4514
- # continuously garbage collects deleted and overwritten data in the background
4515
- # to reclaim storage space. This process is known as "version GC". By default,
4516
- # version GC reclaims versions after they are one hour old. Because of this,
4517
- # Cloud Spanner cannot perform reads at read timestamps more than one hour in
4518
- # the past. This restriction also applies to in-progress reads and/or SQL
4519
- # queries whose timestamp become too old while executing. Reads and SQL queries
4520
- # with too-old read timestamps fail with the error `FAILED_PRECONDITION`. You
4521
- # can configure and extend the `VERSION_RETENTION_PERIOD` of a database up to a
4522
- # period as long as one week, which allows Cloud Spanner to perform reads up to
4523
- # one week in the past. Partitioned DML transactions: Partitioned DML
4524
- # transactions are used to execute DML statements with a different execution
4525
- # strategy that provides different, and often better, scalability properties for
4526
- # large, table-wide operations than DML in a ReadWrite transaction. Smaller
4527
- # scoped statements, such as an OLTP workload, should prefer using ReadWrite
4528
- # transactions. Partitioned DML partitions the keyspace and runs the DML
4529
- # statement on each partition in separate, internal transactions. These
4530
- # transactions commit automatically when complete, and run independently from
4531
- # one another. To reduce lock contention, this execution strategy only acquires
4532
- # read locks on rows that match the WHERE clause of the statement. Additionally,
4533
- # the smaller per-partition transactions hold locks for less time. That said,
4534
- # Partitioned DML is not a drop-in replacement for standard DML used in
4535
- # ReadWrite transactions. - The DML statement must be fully-partitionable.
4536
- # Specifically, the statement must be expressible as the union of many
4537
- # statements which each access only a single row of the table. - The statement
4538
- # is not applied atomically to all rows of the table. Rather, the statement is
4539
- # applied atomically to partitions of the table, in independent transactions.
4540
- # Secondary index rows are updated atomically with the base table rows. -
4541
- # Partitioned DML does not guarantee exactly-once execution semantics against a
4542
- # partition. The statement will be applied at least once to each partition. It
4543
- # is strongly recommended that the DML statement should be idempotent to avoid
4544
- # unexpected results. For instance, it is potentially dangerous to run a
4545
- # statement such as `UPDATE table SET column = column + 1` as it could be run
4546
- # multiple times against some rows. - The partitions are committed automatically
4547
- # - there is no support for Commit or Rollback. If the call returns an error, or
4548
- # if the client issuing the ExecuteSql call dies, it is possible that some rows
4549
- # had the statement executed on them successfully. It is also possible that
4550
- # statement was never executed against other rows. - Partitioned DML
4551
- # transactions may only contain the execution of a single DML statement via
4552
- # ExecuteSql or ExecuteStreamingSql. - If any error is encountered during the
4553
- # execution of the partitioned DML operation (for instance, a UNIQUE INDEX
4554
- # violation, division by zero, or a value that cannot be stored due to schema
4555
- # constraints), then the operation is stopped at that point and an error is
4556
- # returned. It is possible that at this point, some partitions have been
4092
+ # In addition, if TransactionOptions.read_only.return_read_timestamp is set to
4093
+ # true, a special value of 2^63 - 2 will be returned in the Transaction message
4094
+ # that describes the transaction, instead of a valid read timestamp. This
4095
+ # special value should be discarded and not used for any subsequent queries.
4096
+ # Please see https://cloud.google.com/spanner/docs/change-streams for more
4097
+ # details on how to query the change stream TVFs. Partitioned DML transactions:
4098
+ # Partitioned DML transactions are used to execute DML statements with a
4099
+ # different execution strategy that provides different, and often better,
4100
+ # scalability properties for large, table-wide operations than DML in a
4101
+ # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
4102
+ # should prefer using ReadWrite transactions. Partitioned DML partitions the
4103
+ # keyspace and runs the DML statement on each partition in separate, internal
4104
+ # transactions. These transactions commit automatically when complete, and run
4105
+ # independently from one another. To reduce lock contention, this execution
4106
+ # strategy only acquires read locks on rows that match the WHERE clause of the
4107
+ # statement. Additionally, the smaller per-partition transactions hold locks for
4108
+ # less time. That said, Partitioned DML is not a drop-in replacement for
4109
+ # standard DML used in ReadWrite transactions. - The DML statement must be fully-
4110
+ # partitionable. Specifically, the statement must be expressible as the union of
4111
+ # many statements which each access only a single row of the table. - The
4112
+ # statement is not applied atomically to all rows of the table. Rather, the
4113
+ # statement is applied atomically to partitions of the table, in independent
4114
+ # transactions. Secondary index rows are updated atomically with the base table
4115
+ # rows. - Partitioned DML does not guarantee exactly-once execution semantics
4116
+ # against a partition. The statement will be applied at least once to each
4117
+ # partition. It is strongly recommended that the DML statement should be
4118
+ # idempotent to avoid unexpected results. For instance, it is potentially
4119
+ # dangerous to run a statement such as `UPDATE table SET column = column + 1` as
4120
+ # it could be run multiple times against some rows. - The partitions are
4121
+ # committed automatically - there is no support for Commit or Rollback. If the
4122
+ # call returns an error, or if the client issuing the ExecuteSql call dies, it
4123
+ # is possible that some rows had the statement executed on them successfully. It
4124
+ # is also possible that statement was never executed against other rows. -
4125
+ # Partitioned DML transactions may only contain the execution of a single DML
4126
+ # statement via ExecuteSql or ExecuteStreamingSql. - If any error is encountered
4127
+ # during the execution of the partitioned DML operation (for instance, a UNIQUE
4128
+ # INDEX violation, division by zero, or a value that cannot be stored due to
4129
+ # schema constraints), then the operation is stopped at that point and an error
4130
+ # is returned. It is possible that at this point, some partitions have been
4557
4131
  # committed (or even committed multiple times), and other partitions have not
4558
4132
  # been run at all. Given the above, Partitioned DML is good fit for large,
4559
4133
  # database-wide, operations that are idempotent, such as deleting old rows from
@@ -4568,165 +4142,45 @@ module Google
4568
4142
  # @return [String]
4569
4143
  attr_accessor :id
4570
4144
 
4571
- # Transactions: Each session can have at most one active transaction at a time (
4572
- # note that standalone reads and queries use a transaction internally and do
4573
- # count towards the one transaction limit). After the active transaction is
4574
- # completed, the session can immediately be re-used for the next transaction. It
4575
- # is not necessary to create a new session for each transaction. Transaction
4576
- # modes: Cloud Spanner supports three transaction modes: 1. Locking read-write.
4577
- # This type of transaction is the only way to write data into Cloud Spanner.
4578
- # These transactions rely on pessimistic locking and, if necessary, two-phase
4579
- # commit. Locking read-write transactions may abort, requiring the application
4580
- # to retry. 2. Snapshot read-only. This transaction type provides guaranteed
4581
- # consistency across several reads, but does not allow writes. Snapshot read-
4582
- # only transactions can be configured to read at timestamps in the past.
4583
- # Snapshot read-only transactions do not need to be committed. 3. Partitioned
4584
- # DML. This type of transaction is used to execute a single Partitioned DML
4585
- # statement. Partitioned DML partitions the key space and runs the DML statement
4586
- # over each partition in parallel using separate, internal transactions that
4587
- # commit independently. Partitioned DML transactions do not need to be committed.
4588
- # For transactions that only read, snapshot read-only transactions provide
4589
- # simpler semantics and are almost always faster. In particular, read-only
4590
- # transactions do not take locks, so they do not conflict with read-write
4591
- # transactions. As a consequence of not taking locks, they also do not abort, so
4592
- # retry loops are not needed. Transactions may only read-write data in a single
4593
- # database. They may, however, read-write data in different tables within that
4594
- # database. Locking read-write transactions: Locking transactions may be used to
4595
- # atomically read-modify-write data anywhere in a database. This type of
4596
- # transaction is externally consistent. Clients should attempt to minimize the
4597
- # amount of time a transaction is active. Faster transactions commit with higher
4598
- # probability and cause less contention. Cloud Spanner attempts to keep read
4599
- # locks active as long as the transaction continues to do reads, and the
4600
- # transaction has not been terminated by Commit or Rollback. Long periods of
4601
- # inactivity at the client may cause Cloud Spanner to release a transaction's
4602
- # locks and abort it. Conceptually, a read-write transaction consists of zero or
4603
- # more reads or SQL statements followed by Commit. At any time before Commit,
4604
- # the client can send a Rollback request to abort the transaction. Semantics:
4605
- # Cloud Spanner can commit the transaction if all read locks it acquired are
4606
- # still valid at commit time, and it is able to acquire write locks for all
4607
- # writes. Cloud Spanner can abort the transaction for any reason. If a commit
4608
- # attempt returns `ABORTED`, Cloud Spanner guarantees that the transaction has
4609
- # not modified any user data in Cloud Spanner. Unless the transaction commits,
4610
- # Cloud Spanner makes no guarantees about how long the transaction's locks were
4611
- # held for. It is an error to use Cloud Spanner locks for any sort of mutual
4612
- # exclusion other than between Cloud Spanner transactions themselves. Retrying
4613
- # aborted transactions: When a transaction aborts, the application can choose to
4614
- # retry the whole transaction again. To maximize the chances of successfully
4615
- # committing the retry, the client should execute the retry in the same session
4616
- # as the original attempt. The original session's lock priority increases with
4617
- # each consecutive abort, meaning that each attempt has a slightly better chance
4618
- # of success than the previous. Under some circumstances (for example, many
4619
- # transactions attempting to modify the same row(s)), a transaction can abort
4620
- # many times in a short period before successfully committing. Thus, it is not a
4621
- # good idea to cap the number of retries a transaction can attempt; instead, it
4622
- # is better to limit the total amount of time spent retrying. Idle transactions:
4623
- # A transaction is considered idle if it has no outstanding reads or SQL queries
4624
- # and has not started a read or SQL query within the last 10 seconds. Idle
4625
- # transactions can be aborted by Cloud Spanner so that they don't hold on to
4626
- # locks indefinitely. If an idle transaction is aborted, the commit will fail
4627
- # with error `ABORTED`. If this behavior is undesirable, periodically executing
4628
- # a simple SQL query in the transaction (for example, `SELECT 1`) prevents the
4629
- # transaction from becoming idle. Snapshot read-only transactions: Snapshot read-
4630
- # only transactions provides a simpler method than locking read-write
4631
- # transactions for doing several consistent reads. However, this type of
4632
- # transaction does not support writes. Snapshot transactions do not take locks.
4633
- # Instead, they work by choosing a Cloud Spanner timestamp, then executing all
4634
- # reads at that timestamp. Since they do not acquire locks, they do not block
4635
- # concurrent read-write transactions. Unlike locking read-write transactions,
4636
- # snapshot read-only transactions never abort. They can fail if the chosen read
4637
- # timestamp is garbage collected; however, the default garbage collection policy
4638
- # is generous enough that most applications do not need to worry about this in
4639
- # practice. Snapshot read-only transactions do not need to call Commit or
4640
- # Rollback (and in fact are not permitted to do so). To execute a snapshot
4641
- # transaction, the client specifies a timestamp bound, which tells Cloud Spanner
4642
- # how to choose a read timestamp. The types of timestamp bound are: - Strong (
4643
- # the default). - Bounded staleness. - Exact staleness. If the Cloud Spanner
4644
- # database to be read is geographically distributed, stale read-only
4645
- # transactions can execute more quickly than strong or read-write transactions,
4646
- # because they are able to execute far from the leader replica. Each type of
4647
- # timestamp bound is discussed in detail below. Strong: Strong reads are
4648
- # guaranteed to see the effects of all transactions that have committed before
4649
- # the start of the read. Furthermore, all rows yielded by a single read are
4650
- # consistent with each other -- if any part of the read observes a transaction,
4651
- # all parts of the read see the transaction. Strong reads are not repeatable:
4652
- # two consecutive strong read-only transactions might return inconsistent
4653
- # results if there are concurrent writes. If consistency across reads is
4654
- # required, the reads should be executed within a transaction or at an exact
4655
- # read timestamp. See TransactionOptions.ReadOnly.strong. Exact staleness: These
4656
- # timestamp bounds execute reads at a user-specified timestamp. Reads at a
4657
- # timestamp are guaranteed to see a consistent prefix of the global transaction
4658
- # history: they observe modifications done by all transactions with a commit
4659
- # timestamp less than or equal to the read timestamp, and observe none of the
4660
- # modifications done by transactions with a larger commit timestamp. They will
4661
- # block until all conflicting transactions that may be assigned commit
4662
- # timestamps <= the read timestamp have finished. The timestamp can either be
4663
- # expressed as an absolute Cloud Spanner commit timestamp or a staleness
4664
- # relative to the current time. These modes do not require a "negotiation phase"
4665
- # to pick a timestamp. As a result, they execute slightly faster than the
4666
- # equivalent boundedly stale concurrency modes. On the other hand, boundedly
4667
- # stale reads usually return fresher results. See TransactionOptions.ReadOnly.
4668
- # read_timestamp and TransactionOptions.ReadOnly.exact_staleness. Bounded
4669
- # staleness: Bounded staleness modes allow Cloud Spanner to pick the read
4670
- # timestamp, subject to a user-provided staleness bound. Cloud Spanner chooses
4671
- # the newest timestamp within the staleness bound that allows execution of the
4672
- # reads at the closest available replica without blocking. All rows yielded are
4673
- # consistent with each other -- if any part of the read observes a transaction,
4674
- # all parts of the read see the transaction. Boundedly stale reads are not
4675
- # repeatable: two stale reads, even if they use the same staleness bound, can
4676
- # execute at different timestamps and thus return inconsistent results.
4677
- # Boundedly stale reads execute in two phases: the first phase negotiates a
4678
- # timestamp among all replicas needed to serve the read. In the second phase,
4679
- # reads are executed at the negotiated timestamp. As a result of the two phase
4680
- # execution, bounded staleness reads are usually a little slower than comparable
4681
- # exact staleness reads. However, they are typically able to return fresher
4682
- # results, and are more likely to execute at the closest replica. Because the
4683
- # timestamp negotiation requires up-front knowledge of which rows will be read,
4684
- # it can only be used with single-use read-only transactions. See
4685
- # TransactionOptions.ReadOnly.max_staleness and TransactionOptions.ReadOnly.
4686
- # min_read_timestamp. Old read timestamps and garbage collection: Cloud Spanner
4687
- # continuously garbage collects deleted and overwritten data in the background
4688
- # to reclaim storage space. This process is known as "version GC". By default,
4689
- # version GC reclaims versions after they are one hour old. Because of this,
4690
- # Cloud Spanner cannot perform reads at read timestamps more than one hour in
4691
- # the past. This restriction also applies to in-progress reads and/or SQL
4692
- # queries whose timestamp become too old while executing. Reads and SQL queries
4693
- # with too-old read timestamps fail with the error `FAILED_PRECONDITION`. You
4694
- # can configure and extend the `VERSION_RETENTION_PERIOD` of a database up to a
4695
- # period as long as one week, which allows Cloud Spanner to perform reads up to
4696
- # one week in the past. Partitioned DML transactions: Partitioned DML
4697
- # transactions are used to execute DML statements with a different execution
4698
- # strategy that provides different, and often better, scalability properties for
4699
- # large, table-wide operations than DML in a ReadWrite transaction. Smaller
4700
- # scoped statements, such as an OLTP workload, should prefer using ReadWrite
4701
- # transactions. Partitioned DML partitions the keyspace and runs the DML
4702
- # statement on each partition in separate, internal transactions. These
4703
- # transactions commit automatically when complete, and run independently from
4704
- # one another. To reduce lock contention, this execution strategy only acquires
4705
- # read locks on rows that match the WHERE clause of the statement. Additionally,
4706
- # the smaller per-partition transactions hold locks for less time. That said,
4707
- # Partitioned DML is not a drop-in replacement for standard DML used in
4708
- # ReadWrite transactions. - The DML statement must be fully-partitionable.
4709
- # Specifically, the statement must be expressible as the union of many
4710
- # statements which each access only a single row of the table. - The statement
4711
- # is not applied atomically to all rows of the table. Rather, the statement is
4712
- # applied atomically to partitions of the table, in independent transactions.
4713
- # Secondary index rows are updated atomically with the base table rows. -
4714
- # Partitioned DML does not guarantee exactly-once execution semantics against a
4715
- # partition. The statement will be applied at least once to each partition. It
4716
- # is strongly recommended that the DML statement should be idempotent to avoid
4717
- # unexpected results. For instance, it is potentially dangerous to run a
4718
- # statement such as `UPDATE table SET column = column + 1` as it could be run
4719
- # multiple times against some rows. - The partitions are committed automatically
4720
- # - there is no support for Commit or Rollback. If the call returns an error, or
4721
- # if the client issuing the ExecuteSql call dies, it is possible that some rows
4722
- # had the statement executed on them successfully. It is also possible that
4723
- # statement was never executed against other rows. - Partitioned DML
4724
- # transactions may only contain the execution of a single DML statement via
4725
- # ExecuteSql or ExecuteStreamingSql. - If any error is encountered during the
4726
- # execution of the partitioned DML operation (for instance, a UNIQUE INDEX
4727
- # violation, division by zero, or a value that cannot be stored due to schema
4728
- # constraints), then the operation is stopped at that point and an error is
4729
- # returned. It is possible that at this point, some partitions have been
4145
+ # In addition, if TransactionOptions.read_only.return_read_timestamp is set to
4146
+ # true, a special value of 2^63 - 2 will be returned in the Transaction message
4147
+ # that describes the transaction, instead of a valid read timestamp. This
4148
+ # special value should be discarded and not used for any subsequent queries.
4149
+ # Please see https://cloud.google.com/spanner/docs/change-streams for more
4150
+ # details on how to query the change stream TVFs. Partitioned DML transactions:
4151
+ # Partitioned DML transactions are used to execute DML statements with a
4152
+ # different execution strategy that provides different, and often better,
4153
+ # scalability properties for large, table-wide operations than DML in a
4154
+ # ReadWrite transaction. Smaller scoped statements, such as an OLTP workload,
4155
+ # should prefer using ReadWrite transactions. Partitioned DML partitions the
4156
+ # keyspace and runs the DML statement on each partition in separate, internal
4157
+ # transactions. These transactions commit automatically when complete, and run
4158
+ # independently from one another. To reduce lock contention, this execution
4159
+ # strategy only acquires read locks on rows that match the WHERE clause of the
4160
+ # statement. Additionally, the smaller per-partition transactions hold locks for
4161
+ # less time. That said, Partitioned DML is not a drop-in replacement for
4162
+ # standard DML used in ReadWrite transactions. - The DML statement must be fully-
4163
+ # partitionable. Specifically, the statement must be expressible as the union of
4164
+ # many statements which each access only a single row of the table. - The
4165
+ # statement is not applied atomically to all rows of the table. Rather, the
4166
+ # statement is applied atomically to partitions of the table, in independent
4167
+ # transactions. Secondary index rows are updated atomically with the base table
4168
+ # rows. - Partitioned DML does not guarantee exactly-once execution semantics
4169
+ # against a partition. The statement will be applied at least once to each
4170
+ # partition. It is strongly recommended that the DML statement should be
4171
+ # idempotent to avoid unexpected results. For instance, it is potentially
4172
+ # dangerous to run a statement such as `UPDATE table SET column = column + 1` as
4173
+ # it could be run multiple times against some rows. - The partitions are
4174
+ # committed automatically - there is no support for Commit or Rollback. If the
4175
+ # call returns an error, or if the client issuing the ExecuteSql call dies, it
4176
+ # is possible that some rows had the statement executed on them successfully. It
4177
+ # is also possible that statement was never executed against other rows. -
4178
+ # Partitioned DML transactions may only contain the execution of a single DML
4179
+ # statement via ExecuteSql or ExecuteStreamingSql. - If any error is encountered
4180
+ # during the execution of the partitioned DML operation (for instance, a UNIQUE
4181
+ # INDEX violation, division by zero, or a value that cannot be stored due to
4182
+ # schema constraints), then the operation is stopped at that point and an error
4183
+ # is returned. It is possible that at this point, some partitions have been
4730
4184
  # committed (or even committed multiple times), and other partitions have not
4731
4185
  # been run at all. Given the above, Partitioned DML is good fit for large,
4732
4186
  # database-wide, operations that are idempotent, such as deleting old rows from