Превышено количество транзакций Firebird

У нас есть реализация, запускающая базу данных Firebird, где мы получаем эту ошибку:

"Превышен предел реализации - превышено количество транзакций. Выполните резервное копирование и восстановление, чтобы снова восстановить базу данных."

Мы знаем, как исправить это, сделав только чтение базы данных, выполнив резервное копирование и восстановление и заставив его читать запись снова, однако мы не слишком уверены в том, что это вызывает. У меня такое ощущение, что транзакции ограничены миллиардом (?).

Кто-нибудь может это подтвердить? И каков правильный способ предотвратить это?

Ответ 1

Firebird имеет монотонно увеличивающийся счетчик транзакций в виде подписанного 32-битного целого числа (для 2.5 и более ранних). Таким образом, количество транзакций ограничено +/- 2 31 -1. В Firebird 3 идентификатор транзакции был изменен на неподписанное 48-битное целое число (поэтому предел равен 2 48), с возможностью расширения до 64-битных целых чисел в будущем AFAIK.

Счетчик транзакций reset при выполнении резервного копирования и восстановления с помощью gbak. Это можно сделать в любое время, но когда предел действительно достигнут, он требует маркировки базы данных только для чтения, потому что в базе данных только для чтения "последний" идентификатор транзакции базы данных используется для новых транзакций вместо выделения нового идентификатор транзакции.

Firebird - это база данных MVCC (Multi Version Concurrency Control), что означает, что она поддерживает несколько версий записи. Эти версии записей отмечены идентификатором транзакции, создавшей эту версию. При резервном копировании и восстановлении сохраняются только последние версии и восстанавливаются эти версии записей с низким идентификатором транзакции (вероятно, 1).

Сброс счетчика транзакций невозможен (или, по крайней мере, имеет множество осложнений) из-за видимости версий записей для других транзакций на основе уровня изоляции, времени начала транзакции и т.д. Например, транзакция с повторяемым чтением могут видеть только версии записей, созданные транзакциями, которые были совершены в момент начала транзакции. Рекордные версии, созданные активными транзакциями или транзакциями, которые были совершены после начала транзакции, невидимы.

Невозможно предотвратить это, за исключением регулярного резервного копирования и фактического восстановления до достижения предела транзакции (как это будет reset идентификатор транзакции).

Ответ 2

Марк Роттвил

Доброе утро, как исправить эту ошибку?

МОЯ БАЗА ДАННЫХ ПРОИСХОДИТ

БЛАГОДАРЮ ВАС