транзакции — откат PHP на IBMi db2 не работает

У меня есть две среды IBMi

  1. развитие

    • OS400 V7R1M0 обновлен с последним накопительным PTF,
    • Версия PHP: 5.6.5
    • Версия Zend Server: 8.0.2
  2. производство

    • OS400 V7R1M0 обновлен с последним накопительным PTF
    • Версия PHP: 5.3.8
    • Версия Zend Server: 5.5.0

У меня проблема с автокоммитом и откатом.
Используя следующий скрипт 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);
}

2

Решение

От поддержки клиентов ZEND:

СОЗДАТЬ СХЕМУ против CRTLIB
По умолчанию для Zend Product для IBMi: ibm_db2.i5_allow_commit = 0 (обработка фиксации не разрешена).

Это было сделано в качестве ZS для IBMi по умолчанию, потому что многие библиотеки IBMi создаются с CRTLIB, который не включает ведение журнала, необходимое для обработки фиксации.
(Что приводит к сбою ВСЕХ сценариев PHP db2, если i5_allow_commit = 1).

Таким образом, у вас есть выбор по умолчанию для php.ini здесь …

  1. ibm_db2.i5_allow_commit = 0, что позволяет наиболее неопытным
    пользователь может написать сценарии PHP ibm_db2, которые будут «работать», отключив
    фиксировать в любой тип схемы (CREATE SCEMA или CRTLIB)
  2. ibm_db2.i5_allow_commit = 1, какой эксперт разработчики баз данных i5 / OS
    будет знать, использовать только в контейнерах с поддержкой журнала CREATE SCEMA
    и пусть все неопытные разработчики PHP-скриптов потерпят неудачу.

Вы должны использовать схемы (библиотеки), созданные с помощью оператора 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.

  • 0 нет фиксации (см. I5_commit для переопределения)
  • 1 разрешить коммит (см. I5_commit для переопределения)

i5_commit
Атрибут i5_commit должен быть установлен до db2_connect ().

Если значение изменилось после того, как соединение было установлено, и соединение с удаленным источником данных, изменение не вступит в силу до следующего успешного db2_connect () для дескриптора соединения.

Обратите внимание, что настройка php.ini ibm_db2.i5_allow_commit = 1 переопределена с помощью параметров i5_commit:

  • DB2_I5_TXN_NO_COMMIT — Настройка по умолчанию Управление фиксацией не
    используемый.
  • DB2_I5_TXN_READ_UNCOMMITTED — грязные чтения, неповторяющиеся чтения и
    фантомы

возможны

  • DB2_I5_TXN_READ_COMMITTED — Грязное чтение невозможно,
    Возможны неповторяющиеся чтения и фантомы.

  • DB2_I5_TXN_REPEATABLE_READ — Грязные чтения и неповторяющиеся чтения
    невозможно. Призраки возможны.

  • DB2_I5_TXN_SERIALIZABLE — Транзакции допускают сериализацию. грязный
    чтения, неповторяющиеся чтения и фантомы невозможны

Пример:
$ options = array («i5_commit» => DB2_I5_TXN_NO_COMMIT);
$ i5 = db2_connect ($ i5localhost, $ i5user, $ i5password, $ options);

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]