У меня есть простая таблица с первичным ключом. Большинство операций чтения выбирают одну строку по точному значению ключа.
Данные в каждой строке поддерживают некоторую связь со строками до и после нее в ключевом порядке. Поэтому, когда я вставляю новую строку, мне нужно прочитать 2 строки, между которыми она собирается войти, выполнить некоторые вычисления и затем вставить.
Очевидно, что проблема заключается в том, что в то же время другое соединение может добавить строку со значением ключа в том же интервале. Я покрываюсь, если это точно такое же значение ключа, что и вторая вставка потерпит неудачу, но если значение ключа отличается, но в том же интервале, связь может быть нарушена.
Решение, похоже, заключается в блокировке всей таблицы для записи, когда я решаю добавить новую строку, или (если это возможно, в чем я сомневаюсь), чтобы заблокировать интервал значений ключа. Тем не менее, я бы предпочел, чтобы в это время транзакции только для чтения не блокировались.
Я использую ODBC с libodbc ++ оболочкой для C ++ в клиентской программе и бесплатной редакции IBM DB2 (хотя выбор БД все еще может измениться). Вот что я подумал сделать:
- запуск соединения в режиме автоматической фиксации и изоляции по умолчанию
- когда нужно добавить новую строку, установить автоматическую фиксацию в false и режим изоляции в сериализованный
- читать строки до и после нового значения ключа
- вычислить и вставить новую строку
- 1022 * совершить *
- возврат в режим автоматической фиксации и изоляции по умолчанию
Будет ли это делать работу? Будет ли разрешено чтение других транзакций одновременно? Есть ли другие / лучшие способы сделать это?
Кстати, я не вижу в libodbc ++ i / f способа указать транзакцию только для чтения. Это возможно в odbc?
РЕДАКТИРОВАТЬ: спасибо за очень полезные ответы, у меня были проблемы с выбором одного.