Уверен, что к одной и той же базе конектитесь? Вопрос совершенно недурацкий, частенько случается. В плане отчётов разница между снапшотом и рк простая - снапшот видит всю базу в том состоянии, в котором она была на момент его старта.
База одна и та же, уверен. Насчет режимо ты совершенно прав. Я тоже считаю, что при нормальной работе сервера и snapshot и read comitted должны видть совершенно одинаковые записи если транзакции кторые изменяли эти данные были закончены до того, как их считывали. Но в нашем случае это правило похоже не выполняется.
Вот чего я сейчас своими глазами обнаружил:
Есть таблица T_MESSAGE, через неё приложения обмнениваются сообщениями. Всё происходило на рабочей Аналитической базе.
шаг 1 Есть приложение, назовём её Program1, которая обнуляет флаг в этой таблице. Запрос типа update t_message set messagevalue = 0 where messageid = 37
шаг 2 Затем Program1 удаленно запускает вторую задачу Program2, которая находитяс на другой машине, и которая должна при своем успешном окончании этот флаг выставить в "2",
запрос типа update t_message seе messagevalue = 2 where messageid = 37
шаг 3 Первая задача чтобы определить момент окончания работы program2 тем временем сканирует флаг в T_MESSAGE (режим опять snapshot) в ожидании, когда значения флага будет равно "2", запрос типа select * from t_message where messageid = 37.
На этапе 1 первая задача была убита, предполагаю, что update записи был выполнен, а commit выполнен не был. Autocommita там нет. Режим транзакции snapshot. Всё это я выполнял на своей локальной машине.
Через некоторое время последовали звонки от юзеров с жалобами на ошибки.
Вот что делали пользователи:
Запуск своего экземпляра Program1 со своего рабочего места.
1 Та выполняет шаг 1, update прошел
2 Далее запускается Program2
3 После чего Program1 пытается просматривать флаг и выдает сообщение, что запись в T_MESSAGE с нужным ID отсутствует. Это возможно, только если select * from t_message where messageid = 37 дает пустую выборку.
Смотрю под отладчиком. Выборка действительно пустая.
Запускаю тот же запрос в IB Expert. Там режим read comitted. Выборка непустая.
Для проверки до перезагрузки сервера выполнял с других машин select * from t_message where messageid = 37 в разных режимах. При snapshot выборка пустая. При read comitted нет.
Предположили, что в базе зависшая транзакция. Выгнали всех юзеров. и перегрузили сервер. После перезагрузки записи опять НЕТ. Смотрели через IB Expert. Пришлось добавлять её вручную. Это при том, что в софте работающем с этой таблицей нигде нет команд на какие-либо удаления записей из T_MESSAGE. Везде только чтения и update. Все это происходит на одной и той же базе.
Т.е. получается, что IB как-то некорректно отработал при сочетании событий update + обрыв коннекта?