2015-06-09 2 views
2

Я два IBMi средыPHP Откат на IBMi db2 не работает

  1. развития

    • OS400 V7R1M0 обновляется с последними кумулятивный ПТФ,
    • PHP Версия: 5.6.5
    • Zend Server Версия: 8.0.2
  2. производство

    • OS400 V7R1M0 обновляется с последними кумулятивного ПТФ
    • PHP Version: 5.3.8
    • Zend Server Version: 5.5.0

У меня есть вопрос, связанный с AUTOCOMMIT и откат. Используя следующий скрипт php на обеих средах, я получаю разные типы поведения. Разработка IBMi правильно помещает записи в таблицу и после откат удаляет их. С другой стороны, производственные записи записывают записи в таблицу, , но не запускают команду отката и записи остаются в файле. Очевидно, что я запустил то же самое, действия, необходимые для активации JOURNALING в таблице/файле.

Я заметил, что команда отката работает с одним и тем же файлом и с программой 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); 
} 
+0

Фактически вы не начинаете транзакцию. Итак, что нужно откат? – hek2mgl

+0

В более старых версиях ibm_db2, таких как у вас, вы должны установить ibm_db2.в /usr/local/zendsvr6/etc/conf.d/ibm_db2.ini –

+0

i5_allow_commit = 1 @ hek2mgl Сделка начинается с подключения, установив 'AutoCommit' => DB2_AUTOCOMMIT_OFF 'i5_commit' => DB2_I5_TXN_READ_COMMITTED в опциях ! –

ответ

0

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

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

Это было сделано как ZS Для IBMi по умолчанию, потому что многие библиотеки IBMi созданы с использованием CRTLIB, который не позволяет вести журнал, необходимый для обработки фиксации (что приводит к сбою во всех сценариях PHP 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 скрипт FAIL ,

Вы должны использовать схемы (библиотеки), созданные с помощью оператора SQL CREATE SCHEMA over CRTLIB, чтобы включить ведение журнала.

API-интерфейс фиксации ibm_db2 не будет функционировать без включения журнала в схеме (библиотеке). Кроме того, некоторые сценарии BLOB/CLOB для ibm_db2 требуют включения журнала.

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp

Commit/Откат
Чтобы включить все функции ibm_db2 фиксации, вариант входа ibm_db2.i5_allow_commit должен быть установлен в файле php.ini

php.ini запись ibm_db2.i5_allow_commit (integer)
Этот параметр управляет режимом фиксации, используемым для коллекций схем i5 в приложении PHP. не

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

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

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

Примечание заходящего ibm_db2.i5_allow_commit = 1 php.ini переопределены с параметрами i5_commit:

  • DB2_I5_TXN_NO_COMMIT - По умолчанию управление установка обязательства не используется.
  • DB2_I5_TXN_READ_UNCOMMITTED - Dirty читает, неповторяющиеся чтения и фантомы

возможны.

  • DB2_I5_TXN_READ_COMMITTED - Dirty читает не представляется возможным, неповторяющиеся чтения и фантомы возможны.

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

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

Пример:
$ Варианты = Array ("i5_commit" => DB2_I5_TXN_NO_COMMIT);
$ i5 = db2_connect ($ i5localhost, $ i5user, $ i5password, $ options);

+0

Комментарий к «использование схем (библиотек), созданных с помощью оператора SQL CREATE SCHEMA over CRTLIB для включения ведения журнала» - _dated_. Существует команда Start Journal Library (STRJRNLIB) для выполнения неявного ведения журнала, аналогичного тому, как это сделано для TABLE, созданного в библиотеке, созданной с помощью CREATE SCHEMA, но имя журнала не ограничено именем QSQJRN в этой схеме; кроме того, для целей восстановления каждый журнал идеально имел бы уникальное имя, которое нарушает обычное имя QSQJRN. – CRPence

Смежные вопросы