2009-06-13 6 views
2

Есть ли способ разделить одну транзакцию между двумя потоками в коде на основе django?Общий объем транзакций между потоками в python/django? (PostgreSQL)

Проблема заключается в том, что у меня есть TestCase 1.1 (те, которые переносят отдельные тесты в транзакции), которые предназначены для тестирования кода, который выполняется в другом потоке [своего рода асинхронное тестирование]. Таким образом, эти тесты создают некоторые данные, которые предназначены для использования этим вторым потоком. Очевидно, что поскольку эти данные создаются в пределах транзакции, он не отображается во втором потоке. Но так как это должно в основном быть тем же самым соединением с PgSQL (должно ли это?), Я надеюсь, что есть способ поделиться этой областью транзакций, чтобы мой второй поток мог получить доступ к добавленным в него данным? ..

Любая идея?

База данных PgSQL 8.3, драйвер - postgresql_psycopg2. Django - багажник.

ответ

3

Я бы сказал, что это невозможно. Насколько мне известно, каждый поток имеет свой собственный сеанс PostgreSQL, который может работать одновременно. И учитывая, что PostgreSQL является базой данных MVCC, один поток не будет иметь доступа к изменениям другого пользователя, пока транзакция не будет выполнена, что не будет в случае Django 1.1 TestCase.

Если вам нужно протестировать материал, который работает одновременно, я уверен, что вам нужно использовать TransactionTestCase.

+0

TransactionTestCase убивает меня - по какой-либо причине TRUNCATE принимает * forever * для завершения ... –

+0

Вы проверили, был ли второй поток остановлен до окончания теста? Это может привести к тому, что усечка будет выполняться намного медленнее, поскольку на MVCC PostgreSQL необходимо сохранить копию усеченных данных. – mikl

+0

hm, это интересно .. вся идея заключалась в том, чтобы не останавливать фоновый поток на протяжении всей жизни тестов. в этом случае я мог бы просто рассмотреть запуск и остановку 2-го потока в каждом setUp и tearDown, соответственно. –