비동기 트랜잭션을 수행하는 방법을 모르겠지만 psycopg2 (read here 일 수 있음)로 비동기 I/O를 수행 할 수 있습니다. 사물의 순서 고려 :파이썬 비동기 트랜잭션 psycopg2
- 녹색 스레드 1이 시작 트랜잭션 T
- GT1 문제는 업데이트를
- GT2는 하나의 트랜잭션 갱신
- GT1 문제
- GT1 업데이트를 발행는
GT1 업데이트가 GT2 업데이트와 충돌한다고 가정합니다. 이제 docs에 따라
: 동일한 연결에서 생성커서는 즉, 커서하여 데이터베이스에 수행 어떤 변화는 다른 커서 으로 표시 바로이며, 격리되지 않습니다.
위의 흐름을 커서에 구현할 수 없습니다. 우리는 다른 연결에서 그것을 구현할 수 있지만 우리는 async를하고 있기 때문에 (잠재적으로) 수천 개의 db 연결을 생성하는 것이 좋지 않을 수 있습니다. Postgres가 너무 많은 것을 처리 할 수는 없습니다.
다른 옵션은 연결 풀을 만들어 다시 사용하는 것입니다. 그러나 X 병렬 트랜잭션을 실행하면 다른 모든 녹색 스레드는 일부 연결을 사용할 수있을 때까지 차단됩니다. 따라서 유용한 녹색 스레드의 실제 양은 ~ X입니다 (응용 프로그램이 많이 바운드 된 것으로 가정). 질문이 제기됩니다. 왜 비동기를 사용하여 시작합니까?
이제이 질문은 DB API 2.0으로 일반화 될 수 있습니다. 어쩌면 진짜 대답은 DB API 2.0이 비동기 프로그래밍에 적합하지 않다는 것입니다. 그럼 Postgresql에서 async io를 어떻게 처리할까요? 어쩌면 다른 도서관일까요?
아니면 postgresql 프로토콜이 실제로 동기 적이기 때문입니까? 언제든지 (연결 당) 모든 트랜잭션에 "쓰기"할 수 있으면 완벽 할 것입니다. PostgreSQL은 트랜잭션의 id를 공개해야합니다. 그것은 가능합니까? 아마도 2 단계 커밋이 그 대답일까요?
여기에 뭔가가 있습니까?
편집 :BEGIN; COMMIT;
의미론은 비동기식으로 효율적으로 사용할 수 없으므로 SQL의 일반적인 문제인 것 같습니다.
같은 연결로 여러 트랜잭션이 안정적으로 연결됩니다. (여러 개의 'with'문에서 사용됨) (http://initd.org/psycopg/docs/usage.html#with-statement) –
@ClodoaldoNeto 먼저'with' 비동기 모드에서는 사용할 수 없습니다. 둘째로 나는이 SO 게시물에 따라 이것이 가능하다고 생각하지 않는다. http://stackoverflow.com/questions/11620263/postgresql-multiple-transactions-on-the-same-connection 이것은 내 결론에 동의 할 것이다. '시작. COMMIT;'의미론.질문은 실제로 병렬 트랜잭션에 관한 것입니다. – freakish