Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IBMi db2上的PHP回滚不';行不通_Php_Transactions_Ibm Midrange_Rollback_Db2 400 - Fatal编程技术网

IBMi db2上的PHP回滚不';行不通

IBMi db2上的PHP回滚不';行不通,php,transactions,ibm-midrange,rollback,db2-400,Php,Transactions,Ibm Midrange,Rollback,Db2 400,我有两个IBMi环境 发展 OS400 V7R1M0更新为最新的累积PTF PHP版本:5.6.5 Zend服务器版本:8.0.2 生产 OS400 V7R1M0已使用最新累积参数更新 PHP版本:5.3.8 Zend服务器版本:5.5.0 我有一个与自动提交和回滚相关的问题。 在这两种环境中使用以下php脚本,我得到了不同的行为。 开发IBMi正确地将记录放入表中,回滚后删除记录。 另一方面,生产人员将记录写入表中, 但不运行rollback命令,记录仍保留在文件中。 显然,我已经以同

我有两个IBMi环境

  • 发展

    • OS400 V7R1M0更新为最新的累积PTF
    • PHP版本:5.6.5
    • Zend服务器版本:8.0.2
  • 生产

    • OS400 V7R1M0已使用最新累积参数更新
    • PHP版本:5.3.8
    • Zend服务器版本:5.5.0
  • 我有一个与自动提交和回滚相关的问题。 在这两种环境中使用以下php脚本,我得到了不同的行为。 开发IBMi正确地将记录放入表中,回滚后删除记录。 另一方面,生产人员将记录写入表中, 但不运行rollback命令,记录仍保留在文件中。 显然,我已经以同样的方式运行了激活所需的操作 在表/文件上记录日志

    我注意到rollback命令在来自和RPG程序的同一个文件上工作

    有人知道与ZendServer或PHP版本相关的一些bug或问题吗

    提前谢谢

    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的对比
    IBMi的Zend产品的默认值是:ibm_db2.i5_allow_commit=0(不允许提交处理)

    这是作为zsforibmi默认设置完成的,因为许多IBMi库都是使用CRTLIB创建的,CRTLIB不支持提交处理所需的日志记录 (如果i5_allow_commit=1,则会导致所有PHP db2脚本失败)

    所以这里基本上有一个php.ini默认选项

  • ibm_db2.i5_allow_commit=0,它允许最缺乏经验的 用户编写PHP ibm_db2脚本,通过禁用 在任何类型的架构中提交(创建SCEMA或CRTLIB)
  • ibm_db2.i5_allow_commit=1哪个i5/OS数据库开发专家 将知道仅在创建启用SCEMA日志的容器中使用 让所有非专业PHP脚本开发人员失败
  • 您应该使用通过CRTLIB上的SQL语句CREATE SCHEMA创建的模式(库)来启用日志记录

    如果模式(库)中没有启用日志,ibm_db2提交API将无法运行。此外,一些ibm_db2 BLOB/CLOB场景需要启用日志

    提交/回滚
    要启用所有ibm_db2提交函数,必须在php.ini文件中设置条目ibm_db2.i5_allow_commit选项

    php.ini条目 ibm_db2.i5_允许_提交(整数)
    此选项控制PHP应用程序中i5架构集合使用的提交模式。

    • 0未提交(有关覆盖,请参阅i5\u提交)
    • 1允许提交(有关覆盖,请参阅i5_提交)
    i5_提交
    i5_commit属性应该在db2_connect()之前设置

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

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

    • DB2_I5_TXN_NO_COMMIT-默认设置COMMIT control不可用 用过
    • DB2_I5_TXN_READ_未提交-脏读、不可重复读和 幻影
    这是可能的

    • DB2_I5_TXN_READ_COMMITTED-脏读是不可能的, 不可重复的读取和幻影是可能的

    • DB2_I5_TXN_可重复_读取-脏读取和不可重复读取是 不可能。幻影是可能的

    • DB2_I5_TXN_可序列化-事务可序列化。肮脏的 无法读取、不可重复读取和幻影
    示例:
    $options=array(“i5_提交”=>DB2_i5_TXN_NO_提交)

    $i5=db2_connect($i5localhost、$i5user、$i5password、$options)

    实际上,您并没有启动事务。那么应该回滚什么呢?在ibm_db2的旧版本中,如您所拥有的,必须在/usr/local/zendsvr6/etc/conf.d/ibm_db2中设置ibm_db2.i5_allow_commit=1。ini@hek2mgl事务从连接开始,通过设置'autocommit'=>DB2\u autocommit\u OFF'i5\u commit'=>DB2\u i5\u TXN\u READ\u COMMITTED到选项中@AlanSeiden谢谢,现在甚至可以在生产环境中工作!我将发布我从Zend客户支持处收到的详细信息。关于“使用模式(库),通过CRTLIB上的SQL语句创建模式以启用日志记录”的注释已注明日期。有Start Journal Library(STRJRNLIB)命令来实现隐式日志记录,类似于在使用CREATE模式创建的库中创建表的方式,但日志名称不限于该模式中的名称QSQJRN;此外,出于恢复目的,理想情况下,每个日志都有一个唯一的名称,这与通用名称QSQJRN相违背。