У меня есть простая таблица с первичным ключом. Большинство операций чтения извлекают одну строку с точным значением ключа.как заблокировать таблицу БД или ряд строк для записи?
Данные в каждой строке поддерживают некоторую взаимосвязь с строками до и после нее в порядке ключа. Поэтому, когда я вставляю новую строку, мне нужно прочитать две строки, между которыми она будет вводиться, сделать некоторые вычисления и затем вставить.
Очевидно, что проблема заключается в том, что в то же время другое соединение может добавить строку с ключевым значением в тот же интервал. Я закрыт, если это точно такое же значение ключа, как и вторая вставка, но если значение ключа отличается, но в том же интервале связь может быть нарушена.
Решение состоит в том, чтобы заблокировать всю таблицу для записи, когда я решил добавить новую строку или (если возможно, что я сомневаюсь), чтобы заблокировать интервал значений ключа. Тем не менее, я бы предпочел, чтобы транзакции только для чтения не были заблокированы в то время.
Я использую ODBC с libodbc++ wrapper for C++ в клиентской программе и бесплатной версии IBM DB2 (хотя выбор БД все равно может измениться). Это то, что я думал, что делать:
- запустить соединение в автоматической фиксации и режим изоляции по умолчанию
- при необходимости добавить новую строку, установите автофиксацию ложного и изоляцию режим в сериализовать
- читать строки до и после нового значения ключа
- вычислений и вставить новую строку
- совершить
- возвращение назад к-фиксации авто и изоляции по умолчанию режим
Будет ли это делать эту работу? Разрешить ли другим транзакциям читать одновременно? Есть ли другие/лучшие способы сделать это?
BTW, я не вижу в libodbC++ i/f способ указать транзакцию только для чтения. Возможно ли это в odbc?
EDIT: спасибо за очень полезные ответы, у меня возникли проблемы с выбором.
Что такое «истинная сериализуемость»? – Quassnoi
Спасибо. К сожалению, DB2 не поддерживает 'LIMIT 1'. Я использую 'ORDER BY' и беру первую строку. Будет ли он блокировать всю таблицу? Я думал об изменении его на 'SELECT * из mytable WHERE key = (SELECT max (key) FROM mytable, где клавиша
davka
Просто исправил мои запросы, забыли предложение ORDER BY. '' 'SELECT max (key) FROM mytable, где ключевой