[pgsql-jp: 28708] current transaction is abortedについて

冨田 直人 ntomita @ pana.net
2003年 1月 16日 (木) 20:29:38 JST


はじめまして、冨田と申します。

[環境]
CPU:UltraSPARC-IIi clock 440MHz
メモリ:1G
OS:Solaris2.6
[ソフト]
apache(ver:1.3.26)
PostgreSQL(ver:7.2.1)
Perl(ver:5.005_03)
DBI(ver:1.3.2)
DBD-Pg(ver:1.13)

数万件のレコードが格納されているファイル(data.txt)から
一行ずつ読込、DBにinsertするプログラムを作成しています。

言語はPerlを使用し、PostgreSQLとやりとりする部分は、
DBIを使用しています。

COMMITのタイミングとしては、100件単位でcommitするように
しているのですが、1万5000件を超えた所から、下記のようなエラーが出力されます。

NOTICE:  current transaction is aborted, queries ignored until end of transaction block

vmstat等を確認するとDisk I/Oの問題のようにも見えるのですが、
原因が掴めない為、こちらに投稿させていただきました。

プログラムが悪いような気もしますので、実際のプログラムを以下に示します。

何か原因が分かりましたら、教えてください。
解り難い説明で申し訳ありませんが、宜しくお願い致します。

#-- <insert.pl> -----------------------------#

    use DBI;

    $cnt = 0;

    # DB接続
    $dbh = DBI->connect("dbi:Pg:dbname=test_db", user, passwd, {
           PrintError => 0,
           AutoCommit => 0
    });

    open(FILE, "<data.txt");

    $sth = $dbh->prepare(
           q{ insert into t_test values(?,?,?,?,?) }
    );

    # ファイル読込
    while (<FILE>) {
        @str = split / /;
        $rv = $sth->execute($str[0],$str[1],$str[2],$str[3],$str[4]);
        $cnt++;

        if(($cnt % 100)==0)
            $dbh->commit;
        }
    }

    close(FILE);

    $dbh->commit;       # COMMIT実行
    $dbh->disconnect;   # DB切断

    exit;

#--------------------------------------------
# t_testテーブルの構成
#--------------------------------------------
psql -d test_db -c "CREATE TABLE t_test(
        date            timestamp,
        msg_id          char(200),
        from_add        char(200),
        to_add          char(100),
        etc             text
);"
# インデックス作成
psql -d test_db -c "CREATE INDEX test_index ON t_test(msg_id);"

-- <ntomita @ pana.net> --




pgsql-jp メーリングリストの案内