Я заливаю в таблицу большущий массив данных с помощью отпрепаренного запроса. При этом, мне надо через каждые NNN записей делать commit.
Вот простой прототип программы, которая пытается коммитить каждую 2-ю запись:
В консоль получаю такой выход:
Что же, получается, что в php препаренные запросы не живут между транзакциями? Надо заново препарить после комита?
Вот простой прототип программы, которая пытается коммитить каждую 2-ю запись:
!/usr/bin/php <?php $db = 'localhost/3050:/var/fbdb/test.fbd'; $username = 'SYSDBA'; $password = 'password'; $dbh = ibase_connect($db, $username, $password); $trh = ibase_trans($dbh, IBASE_WRITE | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT); $sql = 'INSERT INTO PREP (ID, NAME) VALUES (?, ?)'; $sth = ibase_prepare($trh, $sql); for ($i = 1; $i < 10; $i++) { $name = "Name ". $i; echo "Debug: i = " . $i . "\tBefore ibase_execute.\n"; if(!ibase_execute ($sth, $i, $name)) { echo ibase_errmsg(); return; } if ($i % 2 == 0 ) { echo "Debug: i = " . $i . "\tBefore ibase_commit.\n"; ibase_commit($trh); echo "Debug: i = " . $i . "\tBefore ibase_trans.\n"; $trh = ibase_trans($dbh, IBASE_WRITE | IBASE_COMMITTED | IBASE_REC_VERSION | IBASE_NOWAIT); } } echo "End commit\n"; ibase_commit($trh); ibase_free_query($sth); ibase_close($dbh); ?>
В консоль получаю такой выход:
Debug: i = 1 Before ibase_execute. Debug: i = 2 Before ibase_execute. Debug: i = 2 Before ibase_commit. Debug: i = 2 Before ibase_trans. Debug: i = 3 Before ibase_execute. PHP Warning: ibase_execute(): invalid transaction handle (expecting explicit transaction start) in /home/hme/test_prepared_commit.php on line 17 invalid transaction handle (expecting explicit transaction start)
Что же, получается, что в php препаренные запросы не живут между транзакциями? Надо заново препарить после комита?