Я использую PostgreSQL 9.2 в среде Windows. Я нахожусь в среде 2PC (2 phase commit), используя MSDTC.Как ждать во время SELECT, что в ожидании INSERT совершить?
У меня есть клиентское приложение, которое запускает транзакцию на уровне изоляции SERIALIZABLE, вставляет новую строку данных в таблицу для определенного значения внешнего ключа (есть индекс в столбце) и голосует за завершение транзакция (сделка ПОДГОТОВЛЕНА). Сделка будет ОБРАТИТЬСЯ координатором транзакций.
Immediatly после этого, за пределами транзакции, тот же клиент запрашивает все строки для этого же определенного значения внешнего ключа.
Поскольку может произойти задержка до того, как предыдущая транзакция действительно будет совершена, предложение SELECT может вернуть предыдущий снимок данных. На самом деле это случается иногда, и это проблематично. Конечно, приложение может быть переработано, но до тех пор я ищу решение для блокировки. Консультативный замок?
Я уже решил проблему при выполнении UPDATE на определенных строках, затем используя SELECT ... FOR SHARE, и он работает хорошо. SELECT ждет, пока транзакция не зафиксирует и не вернет старые и новые строки.
Теперь я пытаюсь решить его для INSERT. SELECT ... FOR SHARE не блокирует и не возвращает сразу.
Здесь нет проблемы параллелизма, так как только один клиент имеет дело с определенным набором строк. Я уже знаю о MVCC.
Любая помощь приветствуется.
Вы пробовали 'SELECT ... FOR UPDATE'? –
@Denis Yep, такой же результат. –