Я совершенно не понимаю, как работает механизм блокировки в sqlalchemy-psql. Я запускаю приложение python-flask с sqlalchemy и postgres. Поскольку у меня есть несколько потоков, обрабатывающих некоторые данные и обновляющих их в psql, я получаю следующий тупик:
2015-12-31 17: [ОШИБКА] (возникла в результате автосброса, вызванного запросом; рассмотрите возможность использования блока session.no_autoflush, если этот сброс происходит преждевременно) (psycopg2.extensions.TransactionRollbackError) обнаружена взаимоблокировка
ПОДРОБНО: Процесс 22833 ожидает ShareLock для транзакции 14114188; заблокирован процессом 19759.
Процесс 19759 ожидает ShareLock для транзакции 14114189; заблокирован процессом 22833.
Вот как может возникнуть взаимоблокировка:
Thread 1 Thread 2
| (start an sqlalchemy session) |
db.session() db.session()
|(Using sqlalchemy) |
Update row1 of table1 Update row2 of table 1
| |
Update row2 of table1 Update row1 of table1
| |
session.commit() session.commit()
Вот несколько ответов на мою проблему, но я не могу связать их с sqlalchemy.