如果PHP的mysql扩展据说不支持像mysqli这样的事务,为什么我看到有人在网上进行交易?

时间:2011-10-04 12:06:53

标签: php mysql transactions mysqli

我正在阅读关于mysql事务的内容,我认为你必须使用mysqli或PDO才能创建事务。但是,我看到所有使用mysql扩展的堆栈交换和其他站点示例如下:

mysql_query("START TRANSACTION");
$rollback=0

if (!mysql_query($query1)){
$rollback=1
}

if (!mysql_query($query2)){
$rollback=1
}

if (!mysql_query($query3)){
$rollback=1
}

if ($rollback == 1){
mysql_query("ROLLBACK");
}
else{
mysql_query("COMMIT");
}

这样做和使用“特殊”mysqli特定函数mysqli :: rollback和mysqli :: commit之间有什么区别?

此外,如果php脚本崩溃(IE我的app服务器崩溃等)会发生什么,DB服务器是否会在设定的时间段后自动回滚事务?

同样,如果DB服务器在mysql_query(“COMMIT”)之前崩溃会发生什么?交易会“回滚”吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

它也是完全合法的,并且直接使用MySQL语句来实现事务。

坦率地说,我没有看到使用mysqli语法有任何改进。这是一个失败的抽象,因为它只在MySQL上以1:1映射。在PDO中使用更高级别的语法更有意义,因为它将根据底层数据库使用不同的语法进行映射。

然而,正如Hakre所说:mysqli首选for performance and interoperability reasons, it's the recommended mysql lib in PHP.

  

同样,如果DB服务器在mysql_query(“COMMIT”)之前崩溃会发生什么?交易会“回滚”吗?

应用程序崩溃比DB服务器更容易。任何未提交的事务都将被回滚。

也是一项交易can be rolled back because it can't acquire a lock within a certain timeout

  

InnoDB事务在放弃之前可能等待行锁定的超时时间(以秒为单位)。默认值为50秒。尝试访问由另一个InnoDB事务锁定的行的事务将在发出以下错误之前最多挂起这么多秒:

     

错误1205(HY000):超出锁定等待超时;尝试重新启动交易