我有两个IBMi环境
开发
生产
我遇到了与autocommit和rollback相关的问题。 在两个环境中使用以下PHP脚本我得到不同的行为。 开发IBMi正确地将记录放在表中,并在回滚后删除它们。 另一方面,生产者将记录写入表中, 但是没有运行rollback命令,并且记录保留在文件中。 显然,我已经以相同的方式运行了激活所需的动作 在表/文件上进行记录。
我注意到rollback命令适用于来自和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 :(得分:0)
来自ZEND CUSTOMER SUPPORT:
CREATE SCHEMA vs. CRTLIB
Zend Product for IBMi的默认值为:ibm_db2.i5_allow_commit = 0(不允许提交处理)。
这是作为ZS For IBMi默认值完成的,因为许多IBMi库是使用CRTLIB创建的,它不支持提交处理所需的日记功能 (如果i5_allow_commit = 1,则导致所有PHP db2脚本失败。)
所以你在这里基本上有一个php.ini默认选择...
您应该使用通过CRTLIB上的SQL语句CREATE SCHEMA创建的模式(库)来启用日记功能。
如果未在架构(库)中启用日志,则ibm_db2提交API将无法运行。此外,一些ibm_db2 BLOB / CLOB方案需要启用日志。
•http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp
提交/回滚
要启用所有ibm_db2提交函数,必须在php.ini文件中设置条目ibm_db2.i5_allow_commit选项
php.ini条目
ibm_db2.i5_allow_commit(整数)
此选项控制PHP应用程序中用于i5架构集合的提交模式。
i5_commit
应在db2_connect()。
如果在建立连接后更改了值,并且连接是远程数据源,则在下一次成功连接句柄的db2_connect()之前,更改不会生效。
注意使用i5_commit选项覆盖php.ini设置ibm_db2.i5_allow_commit = 1:
是可能的。
DB2_I5_TXN_READ_COMMITTED - 无法进行脏读, 不可重复的读取和幻像是可能的。
DB2_I5_TXN_REPEATABLE_READ - 脏读和不可重复读 不可能。幻影是可能的。
例:
$ options = array(&#34; i5_commit&#34; =&gt; DB2_I5_TXN_NO_COMMIT);
$ i5 = db2_connect($ i5localhost,$ i5user,$ i5password,$ options);