2016-11-08 2 views
0

여러 연결을 사용하여 단일 트랜잭션 범위 내에서 Postgres에 테이블을 동시에 채워야합니다. 가능한가?Postgres에서 하나의 트랜잭션 당 여러 개의 연결이 가능합니까? 골란 사용량

이 병목 현상을 피할 방법이 없습니다.

감사합니다.

+0

을 준비 테이블을 여러 루틴을 작성하고 다음과 같은 사용하여 대량의 데이터를 전송하는 트랜잭션에 "선택에서 삽입"할 수있다 서로 다른 연결을 통해 트랜잭션을 공유 할 수 있습니다. 원하는 것을 더 잘 설명하고 이해하기 쉽게 예제를 추가하십시오. –

+0

나는 csv 파일 집합을 구문 분석하고 데이터베이스에 적절한 테이블을 채우는 golang 명령을 가지고 있습니다. 이 파일은 매우 큽니다. 파서는 파일을 행 단위로 읽고이를 채널에 저장합니다. 네 명의 goroutines가 채널에서 이러한 결과를 가져와 Exec()를 만듭니다. db.Exec()을 수행하면 tx.Exec()가 4 시간 이상 걸리면 전체 프로세스에 25 분이 걸립니다. – MasterJ

+0

또한 현재 파일을 처리 할 때 이전 파일에서 수행 한 변경 사항을 확인해야하므로 다른 트랜잭션에서 다른 파일을 처리 할 수 ​​없습니다. (Postgres는 READ UNCOMMITED를 지원하지 않습니다.) 전체 프로세스의 결과로 하나의 연결 만 사용할 수 있습니다. – MasterJ

답변

0

나는 트랜잭션이 필요 없다고 확신합니다.

많은 싶은 경우 - 당신은 내가 생각하지 않는다

+0

감사합니다. 나는 그것에 대해서도 생각했다. 그런 거래가 필요 없다고 생각하는 이유는 무엇입니까? 요구 사항에 따라 프로세스가 어느 시점에서 실패하면 이전 상태로 데이터베이스를 가져와야합니다. – MasterJ

+0

다운로드 한 데이터가 비즈니스 로직 계층이나 스테이지 테이블에 없는지 확인한 다음 트랜잭션 외부로로드한다고 가정합니다. 대용량의 데이터를 장기간 트랜잭션으로 처리하면 성능 DBMS가 저하됩니다. –

+0

단열재를 가지고 놀 수 있습니다. 1. 원하는 연결 수 (스레드 수)를 선택하십시오. 다른 스레드에서 변경된 내용을 보려면 "uncommitted 읽기"[link] (https://www.postgresql.org/docs/9.6/static/transaction-iso.html) 격리 수준으로 설정하십시오. 2. 그들은 트랜잭션을 시작합니다 3. 스레드가 데이터를로드하면 완료되고 다른 스레드를 기다려야하며 트랜잭션을 커밋하지 않았습니다. 4. 모든 스레드가 완료되면 모든 스레드에서 커밋을 수행합니다. 모든 스레드에 대한 스레드 롤백 변경 중 하나에서 SQL 오류가 발생했습니다. –

관련 문제