IBMi db2上的PHP回滚不';行不通
我有两个IBMi环境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命令,记录仍保留在文件中。 显然,我已经以同
- OS400 V7R1M0更新为最新的累积PTF
- PHP版本:5.6.5
- Zend服务器版本:8.0.2
- OS400 V7R1M0已使用最新累积参数更新
- PHP版本:5.3.8
- Zend服务器版本:5.5.0
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相违背。