IBMi db2上的PHP回滚不起作用

时间:2015-06-09 16:41:42

标签: php transactions ibm-midrange rollback db2-400

我有两个IBMi环境

  1. 开发

    • OS400 V7R1M0更新了最新的累计PTF,
    • PHP版本:5.6.5
    • Zend Server版本:8.0.2
  2. 生产

    • 使用最新累积PTF更新OS400 V7R1M0
    • PHP版本:5.3.8
    • Zend Server版本:5.5.0
  3. 我遇到了与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);
    }
    

1 个答案:

答案 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默认选择...

  1. ibm_db2.i5_allow_commit = 0允许最缺乏经验的人 用户编写将会工作的PHP ibm_db2脚本&#34;通过禁用 提交任何类型的模式(CREATE SCEMA或CRTLIB)
  2. ibm_db2.i5_allow_commit = 1哪位专家i5 / OS数据库开发人员 会知道只在CREATE SCEMA日志启用的容器中使用 并让所有非专家PHP脚本开发人员失败。
  3. 您应该使用通过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架构集合的提交模式。

    • 0没有提交(请参阅i5_commit for override)
    • 1允许提交(请参阅i5_commit for override)

    i5_commit
    应在db2_connect()。

    之前设置i5_commit属性

    如果在建立连接后更改了值,并且连接是远程数据源,则在下一次成功连接句柄的db2_connect()之前,更改不会生效。

    注意使用i5_commit选项覆盖php.ini设置ibm_db2.i5_allow_commit = 1:

    • 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(&#34; i5_commit&#34; =&gt; DB2_I5_TXN_NO_COMMIT);
    $ i5 = db2_connect($ i5localhost,$ i5user,$ i5password,$ options);