【发布时间】:2015-11-15 02:57:08
【问题描述】:
我正在努力实现 PHP 和 MySQL 事务。该脚本通过阻塞重新分配接收 SQL 语句以及一些绑定参数。一切都传递给一个函数“do_transaction”,该函数跟踪接收到的语句数。
我已经用 PdoDebugger 调试了 PDO 语句(在它被处理之后)并且输出是正确的:
UPDATE bla SET processed = 1, severity_ou1 = 'low',
severity_ou2 = 'low', severity_ou3 = 'low', severity_ou4 = 'low',
severity_ou5 = 'low', saved = '1', hname = '1', sname = '1', if = '1',
v = '1', translated = 'blablabla.', filtered = 1, repeated = '1',
excessed = '1', eventfilterid = '212', building = '1', floor = '1'
WHERE id = '121614624'
global $batchcount;
$batchcount = 1;
while(true){
$redis = new Redis();
$redis->connect('xxx', xxx);
$sqlbatch = $redis->blpop('xxx:xxx:sqlfiltermatch', 0);
// blpop returns array: 0 has key, 1 has data.
if(is_array($sqlbatch)){
if(isJson($sqlbatch[1])){
$batchstatements = array();
$batchstatements[] = json_decode($sqlbatch[1], true);
// Get statement and bindparams.
$sqlstatement = $batchstatements[0]['statement'];
$bindparams = $batchstatements[0]['bindparams'];
// Replace empty bindparams.
foreach($bindparams as $column => $value){
if(is_null($value)){ $bindparams[$column] = '1'; }
if(empty($value)){ $bindparams[$column] = '1'; }
}
}
$batchcount++;
do_transaction($sqlstatement, $bindparams, $batchcount);
}
}
function do_transaction($sqlstatement, $bindparams){
global $batchcount;
if($batchcount >= 4){
try {
// Setup DB
$db = new PDO('mysql:host=xxx;dbname=xxx;charset=utf8', 'xxx', 'xxx', array(PDO::ATTR_PERSISTENT => true, PDO::ATTR_AUTOCOMMIT => FALSE, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
echo $db->getAttribute(PDO::ATTR_AUTOCOMMIT)."\n\n";
$db->beginTransaction();
$stmt = $db->prepare($sqlstatement);
// Setup bindparams.
foreach($bindparams as $column => $value){
$stmt->bindParam(":$column", $value);
}
$stmt->execute() or die(print_r($stmt->errorInfo(), true));
echo PdoDebugger::show($sqlstatement, $bindparams)."\n";
$db->commit();
} catch(PDOExecption $e){
//$db->rollback();
print_r("ERROR"); exit;
}
$batchcount = 0;
}
$batchcount++;
}
我已确定 AUTOCOMMIT = FALSE。 “do_transaction”哪里出错了?
【问题讨论】:
-
也许您的查询中有错误,SQL 错误与 PDO_EXCEPTION 不同,所以如果有 [insert error here]、语法错误、转换错误等等,那么事务将不会即使在提交时也完成。
标签: php mysql pdo transactions redis