Я использую PostgreSQL 9.2 в среде Windows. Я работаю в среде 2PC (двухэтапная фиксация) с использованием MSDTC.
У меня есть клиентское приложение, которое запускает транзакцию на уровне изоляции SERIALIZABLE, вставляет новую строку данных в таблицу для определенного значения внешнего ключа (в столбце есть индекс) и голосует за завершение транзакции (The сделка ПОДГОТОВЛЕНА). Транзакция будет СОВЕРШЕНА координатором транзакций.
Сразу после этого, вне транзакции, тот же клиент запрашивает все строки для этого же конкретного значения внешнего ключа.
Поскольку перед действительной фиксацией предыдущей транзакции может возникнуть задержка, предложение SELECT может вернуть предыдущий снимок данных. На самом деле это иногда случается, и это проблематично. Конечно, приложение может быть переработано, но до тех пор я ищу решение для блокировки. Консультативная блокировка?
Я уже решил проблему, выполняя UPDATE для определенных строк, а затем используя SELECT... FOR SHARE, и это работает хорошо. SELECT ждет, пока транзакция не зафиксируется и не вернет старые и новые строки.
Теперь я пытаюсь решить это для INSERT. SELECT...FOR SHARE не блокирует и не возвращает сразу.
Здесь нет проблемы параллелизма, поскольку только один клиент имеет дело с определенным набором строк. Я уже знаю о MVCC.
Любая помощь приветствуется.
SELECT...FOR UPDATE
? - person Denis de Bernardy   schedule 08.07.2013