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

bil*_*rky 5 php mysql mysqli transactions

我正在阅读有关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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

sti*_*vlo 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服务器更容易.任何未提交的事务都将被回滚.

可以回滚事务,因为它无法在特定超时内获取锁定.

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

ERROR 1205(HY000):超出锁定等待超时; 尝试重新启动事务