2016-10-13 7 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

は、あなたの代わりに行うことができます。

あなたは1 TRANSACTIONする全アイテムが必要な場合は、次のように物事を行うための最善の方法は、次のようになります。

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

あなたのコメント@Aadamに対する回答が更新されました。 –

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; 
関連する問題