На этой странице описывается транзакционная конкуренция данных, сериализуемость и изоляция. Для примеров кода транзакции см. транзакции и пакетные записи .
Транзакции и споры данных
Для успешного завершения транзакции документы, извлеченные ее операциями чтения, должны оставаться неизмененными операциями вне транзакции. Если другая операция пытается изменить один из этих документов, эта операция входит в состояние конфликта данных с транзакцией.
- Конфликт данных
- Когда две или более операций конкурируют за контроль над одним и тем же документом. Например, одна транзакция может потребовать, чтобы документ оставался согласованным, в то время как параллельная операция пытается обновить значения полей этого документа.
Cloud Firestore разрешает конфликт данных, задерживая или завершая неудачей одну из операций. Клиентские библиотеки Cloud Firestore автоматически повторяют транзакции, которые не удалось выполнить из-за конфликта данных. После конечного числа повторных попыток операция транзакции завершается неудачей и возвращает сообщение об ошибке:
ABORTED: Too much contention on these documents. Please try again.
При принятии решения о том, какую операцию следует завершить неудачно или отложить, поведение зависит от типа клиентской библиотеки.
Мобильные/веб-SDK используют оптимистичный контроль параллелизма.
Библиотеки сервера-клиента используют пессимистичные элементы управления параллелизмом.
Конфликт данных в мобильных/веб-SDK
Мобильные/веб-SDK (платформы Apple, Android, Web, C++) используют оптимистичные элементы управления параллелизмом для разрешения конфликтов данных.
- Оптимистичный контроль параллелизма
- На основе предположения, что конфликт данных маловероятен или что неэффективно удерживать блокировки базы данных. Оптимистичные транзакции не используют блокировки базы данных для блокировки других операций от изменения данных.
Мобильные/веб-SDK используют оптимистичные элементы управления параллелизмом, поскольку они могут работать в средах с высокой задержкой и ненадежным сетевым соединением. Блокировка документов в среде с высокой задержкой приведет к слишком большому количеству сбоев из-за конфликта данных.
В Mobile/Web SDK транзакция отслеживает все документы, которые вы читаете внутри транзакции. Транзакция завершает свои операции записи только в том случае, если ни один из этих документов не изменился во время выполнения транзакции. Если какой-либо документ изменился, обработчик транзакций повторяет транзакцию. Если транзакция не может получить чистый результат после нескольких повторных попыток, транзакция завершается неудачей из-за конфликта данных.
Конфликт данных в клиентских библиотеках сервера
Библиотеки сервера-клиента (C#, Go, Java, Node.js, PHP, Python, Ruby) используют пессимистичные элементы управления параллелизмом для разрешения конфликтов данных.
- Пессимистический контроль параллелизма
- На основе предположения, что существует вероятность конфликта данных. Пессимистические транзакции используют блокировки базы данных, чтобы предотвратить изменение данных другими операциями.
Библиотеки сервера-клиента используют пессимистичные элементы управления параллелизмом, поскольку они предполагают низкую задержку и надежное соединение с базой данных.
В клиентских библиотеках сервера транзакции блокируют считываемые ими документы. Блокировка транзакции документа блокирует другие транзакции, пакетные записи и нетранзакционные записи от изменения этого документа. Транзакция снимает блокировки документов во время фиксации. Она также снимает блокировки, если истекает время ожидания или происходит сбой по какой-либо причине.
Когда транзакция блокирует документ, другие операции записи должны ждать, пока транзакция снимет блокировку. Транзакции получают свои блокировки в хронологическом порядке.
Сериализуемая изоляция
Конфликт данных между транзакциями тесно связан с уровнями изоляции базы данных. Уровень изоляции базы данных описывает, насколько хорошо система обрабатывает конфликты между параллельными операциями. Конфликт возникает из-за следующих требований к базе данных:
- Для транзакций требуются точные и непротиворечивые данные.
- Для эффективного использования ресурсов базы данных выполняют операции одновременно.
В системах с низким уровнем изоляции операция чтения в рамках транзакции может считывать неточные данные из незафиксированных изменений в параллельной операции.
Сериализуемая изоляция определяет наивысший уровень изоляции. Сериализуемая изоляция означает, что:
- Можно предположить, что база данных выполняет транзакции последовательно.
- На транзакции не влияют незафиксированные изменения в параллельных операциях.
Эта гарантия должна выполняться даже тогда, когда база данных выполняет несколько транзакций параллельно. База данных должна реализовать управление параллелизмом для разрешения конфликтов, которые могут нарушить эту гарантию.
Cloud Firestore гарантирует сериализуемую изоляцию транзакций. Транзакции в Cloud Firestore сериализуются и изолируются по времени фиксации.
Сериализуемая изоляция по времени фиксации
Cloud Firestore назначает каждой транзакции время фиксации, которое представляет собой единую точку во времени. Когда Cloud Firestore фиксирует изменения транзакции в базе данных, можно предположить, что все чтения и записи в транзакции происходят точно во время фиксации.
Фактическое выполнение транзакции требует некоторого промежутка времени. Выполнение транзакции начинается до времени фиксации, и выполнение нескольких операций может перекрываться. Cloud Firestore поддерживает сериализуемую изоляцию и гарантирует, что:
- Cloud Firestore фиксирует транзакции в порядке времени фиксации.
- Cloud Firestore изолирует транзакции от параллельных операций с более поздним временем фиксации.
В случае конфликта данных между параллельными операциями Cloud Firestore использует оптимистичный и пессимистичный контроль параллелизма для разрешения конфликта.
Изоляция внутри транзакции
Изоляция транзакций также применяется к операциям записи внутри транзакции. Запросы и чтения внутри транзакции не видят результаты предыдущих записей внутри этой транзакции. Даже если вы изменяете или удаляете документ внутри транзакции, все чтения документов в этой транзакции возвращают версию документа на момент фиксации, до операций записи транзакции. Операции чтения ничего не возвращают, если документ тогда не существовал.
Проблемы с конкуренцией данных
Дополнительную информацию о конфликтах данных и способах их устранения можно найти на странице устранения неполадок .