Как повторить коммит Spanner, который был прерван? - PullRequest
0 голосов
/ 13 мая 2019

В документации Spanner для Commit() написано:

Commit может вернуть ошибку ABORTED. Это может произойти в любое время; обычно причина в конфликтах с параллельными транзакциями. Однако это также может произойти по ряду других причин. Если Commit возвращает ABORTED, вызывающий должен повторить попытку транзакции с самого начала, повторно используя тот же сеанс.

https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#google.spanner.v1.Spanner.Commit

Два вопроса:

  1. Если транзакция прервана, нужно ли мне повторять все операторы, которые были выполнены с начала транзакции, чтобы повторить попытку? Или достаточно просто повторить попытку commit()?

  2. Как воспроизвести прерванный коммит на Spanner, чтобы проверить правильность моей логики повторения?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Я рекомендую использовать официальные клиентские библиотеки Cloud Spanner. У них есть различные абстракции обработчика транзакций, которые будут соответствующим образом реагировать на ошибки, включая логику повторных попыток.

  • Если транзакция отменяется, вся транзакция должна быть повторена.

  • Cloud Spanner не предоставляет прямого способа принудительного завершения транзакции. Вы можете настроить две транзакции, чтобы сделать что-то вроде:

    1. BeginTransaction T1
    2. BeginTransaction T2
    3. T1 читать строку1
    4. T2 читать строку1
    5. T1 коммит (запись строки 1) будет успешным
    6. T2 commit (запись строки 1) прервет
1 голос
/ 14 мая 2019

Прерванная транзакция включает конфликты фиксации. Это означает, что данные, которые вы прочитали во время транзакции, могут больше не быть действительными, поэтому все решения, принятые вашим кодом - и данные, которые он пытался записать, могут основываться на недопустимых данных ... поэтому вы должны делать все заново с момента транзакции начал.

Чтобы сделать это конкретным, рассмотрим код, который читает счетчик, удваивает его, а затем записывает этот счетчик обратно. Представьте, что ваш код прочитал 4, попытался написать 8, но получил АБОРТ. После перезапуска транзакции это значение может теперь быть 5, поэтому было бы неправильно пытаться записать эти 8 снова. Вместо этого ваш код должен начинаться с нуля, чтобы вычислить, что ему нужно написать 10. Это сложно, если у вашего кода есть побочные эффекты.

...