2016-10-13 1 views
1

데이터베이스에 동일한 데이터를 생성하는 스크립트가 있습니다. 모양은 다음과 같습니다.테이블 잠금없이 많은 INSERT와 트랜잭션

START TRANSACTION; 
INSERT INTO table (data); 
INSERT INTO table (data); 
INSERT INTO table (data); 
... 
COMMIT; 

스크립트는 약 30 분 동안 실행됩니다. 그러나 작동 중일 때 테이블은 다른 INSERT에 대해 잠겨 있습니다. 스크립트가 끝날 때까지 다른 프로세스의 행을 INSERT 할 수 없습니다. 그게 필요 할까? 트랜잭션을 사용하고 싶지만 전체 테이블을 잠글 수는 없습니다. 그것을 할 방법이 있습니까?

START TRANSACTION; 
INSERT INTO table (data); 
COMMIT; 
START TRANSACTION; 
INSERT INTO table (data); 
COMMIT; 
... 
START TRANSACTION; 
INSERT INTO table (data); 
COMMIT; 

가장 우아하지,하지만 당신이 설명하는 상황에 따라 문제를 해결해야합니다

답변

1

는 대신 할 수 있습니다.

당신은 하나의 트랜잭션 다음, 다음과 같은 일이 될 것입니다 할 수있는 가장 좋은 방법으로 전체 항목을해야하는 경우 : 처리의 모든 때까지, 당신은 트랜잭션을 시작하기에 보류 할

INSERT INTO tmpTableA (dataX); 
INSERT INTO tmpTableB (dataY); 
INSERT INTO tmpTableC (dataZ); 
... 
' Do all the "building/processing above using temp tables either in memory or on disc, and then only when all the "heavy lifting" is done; update/insert the data into your tables. 
... 
START TRANSACTION; 
INSERT INTO tableA (tmpTableA); 
UPDATE tableB.foo = tmpTableB.fee WHERE BlahBlobBlah; 
INSERT INTO tableC (tmpTableC); 
COMMIT; 

끝난.

+0

잘 모르겠어요를 그것이 내가해야 할 것입니다. 전체 스크립트 프로세스에 대한 트랜잭션을 갖고 싶습니다. 스크립트가 모든 행을 삽입했는지 또는 아무것도 삽입하지 않았는지 확인해야합니다. – pronngo

+0

@Adam에 대한 귀하의 의견에 대한 답변이 업데이트되었습니다. –

1

당신은 임시 테이블을 만들어야합니다 table_temp 당신이 최종 테이블에 모든 임시 데이터를 삽입 할 수 있습니다를 준비하는 모든 데이터가 table_temp하는 삽입, :

START TRANSACTION; 
INSERT INTO table_temp (data); 
INSERT INTO table_temp (data); 
INSERT INTO table_temp (data); 

insert into table 
select * from table_temp; 

commit;