У меня есть две среды IBMi
развитие
производство
У меня проблема с автокоммитом и откатом.
Используя следующий скрипт php в обеих средах, я получаю различное поведение.
Разработка IBMi правильно поместила записи в таблицу и после отката удалила их.
С другой стороны, производственный записывает записи в таблицу,
но не запускает команду отката, и записи остаются в файле.
Очевидно, я выполнил, таким же образом, действия, необходимые для активации
ЖУРНАЛ на стол / файл.
Я заметил, что команда отката работает с тем же файлом из программы RPG!
Кто-нибудь знает некоторые ошибки или проблемы, связанные с этой проблемой, касающейся версии ZendServer или PHP?
заранее спасибо
Script:
<?php
ini_set('display_errors', 'On');
ini_set('max_execution_time', 0);
error_reporting(E_ALL);
$options = array(
'i5_naming' => DB2_I5_NAMING_ON,
'DB2_ATTR_CASE' => DB2_CASE_LOWER,
'autocommit' => DB2_AUTOCOMMIT_OFF,
'i5_commit' => DB2_I5_TXN_READ_COMMITTED
);
$conn = db2_connect('DBNAME', 'USER', 'PASSWORD', $options);
if ($conn) {
$stmt = db2_exec($conn, "SELECT count(*) FROM TEST9P");
$res = db2_fetch_array($stmt);
echo $res[0] . "\n";
$ac = db2_autocommit($conn);
if ($ac == 0) {
print "$ac -- AUTOCOMMIT is off.\n";
}
else {
print "$ac -- AUTOCOMMIT is on.\n";
}
// Delete all rows from TEST9P
for ($i = 0;$i < 10;$i++) {
db2_exec($conn, "INSERT INTO TEST9P (test01) VALUES (" . $i . ")");
}
$stmt = db2_exec($conn, "SELECT count(*) FROM TEST9P");
$res = db2_fetch_array($stmt);
echo $res[0] . "\n";
// Roll back the DELETE statement
db2_rollback($conn);
$stmt = db2_exec($conn, "SELECT count(*) FROM TEST9P");
$res = db2_fetch_array($stmt);
echo $res[0] . "\n";
db2_close($conn);
}
От поддержки клиентов ZEND:
СОЗДАТЬ СХЕМУ против CRTLIB
По умолчанию для Zend Product для IBMi: ibm_db2.i5_allow_commit = 0 (обработка фиксации не разрешена).
Это было сделано в качестве ZS для IBMi по умолчанию, потому что многие библиотеки IBMi создаются с CRTLIB, который не включает ведение журнала, необходимое для обработки фиксации.
(Что приводит к сбою ВСЕХ сценариев PHP db2, если i5_allow_commit = 1).
Таким образом, у вас есть выбор по умолчанию для php.ini здесь …
Вы должны использовать схемы (библиотеки), созданные с помощью оператора SQL CREATE SCHEMA поверх CRTLIB, чтобы включить ведение журнала.
API фиксации ibm_db2 не будут работать, если в схеме (библиотеке) не включен журнал. Кроме того, для некоторых сценариев BLOB / CLOB ibm_db2 журнал должен быть включен.
• http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp
Commit / Откат
Чтобы включить все функции фиксации ibm_db2, в файле php.ini должна быть установлена опция entry ibm_db2.i5_allow_commit
запись php.ini
ibm_db2.i5_allow_commit (целое число)
Эта опция управляет режимом фиксации, используемым для коллекций схем i5 в приложении PHP.
i5_commit
Атрибут i5_commit должен быть установлен до db2_connect ().
Если значение изменилось после того, как соединение было установлено, и соединение с удаленным источником данных, изменение не вступит в силу до следующего успешного db2_connect () для дескриптора соединения.
Обратите внимание, что настройка php.ini ibm_db2.i5_allow_commit = 1 переопределена с помощью параметров i5_commit:
возможны
DB2_I5_TXN_READ_COMMITTED — Грязное чтение невозможно,
Возможны неповторяющиеся чтения и фантомы.
DB2_I5_TXN_REPEATABLE_READ — Грязные чтения и неповторяющиеся чтения
невозможно. Призраки возможны.
Пример:
$ options = array («i5_commit» => DB2_I5_TXN_NO_COMMIT);
$ i5 = db2_connect ($ i5localhost, $ i5user, $ i5password, $ options);
Других решений пока нет …