我需要make 2 mysql查询,我需要在事务中进行此操作
$db->query("START TRANSACTION");
$ins_sth1 = $db->prepare("INSERT INTO t1(val) values('a')");
$ins_sth1->execute();
$error_info1 = $ins_sth1->errorInfo();
if ($error_info1[2] === NULL ) {
$ins_sth2 = $db->prepare("INSERT INTO t2(val) values('b')");
$ins_sth2->execute();
$error_info2 = $ins_sth2->errorInfo();
}
else {
echo "First query not executed";
exit;
}
if ($error_info2[2] === NULL) {
$db->query("COMMIT");
echo "All query executed success";
}
else {
$db->query("ROLLBACK ");
echo "Second query not executed";
}
有可能查询未执行,但PDO errorInfo会返回NULL值吗?
也就是说,上面代码中的方法是100%可靠还是不可靠?
答案 0 :(得分:0)
如果PDO遇到错误,它将抛出异常。 因此,如果您想要100%可靠的代码,我建议使用try catch:
try{
$db->beginTransaction();
$ins_sth1 = $db->prepare("INSERT INTO t1(val) values('a')");
$ins_sth1->execute();
$ins_sth2 = $db->prepare("INSERT INTO t2(val) values('b')");
$ins_sth2->execute();
$db->commit();
}
catch (Exception $e) {
$db->rollBack();
}
如果您使用的是PDO,则会有内置的交易功能。
而不是
$db->query("ROLLBACK ");
使用
$db->rollBack();