Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果PHP';s的mysql扩展应该不支持像mysqli这样的事务,为什么我看到人们使用它进行在线事务?_Php_Mysql_Transactions_Mysqli - Fatal编程技术网

如果PHP';s的mysql扩展应该不支持像mysqli这样的事务,为什么我看到人们使用它进行在线事务?

如果PHP';s的mysql扩展应该不支持像mysqli这样的事务,为什么我看到人们使用它进行在线事务?,php,mysql,transactions,mysqli,Php,Mysql,Transactions,Mysqli,我在读mysql事务,我的印象是,为了创建事务,您必须使用mysqli或PDO。但是,我看到了使用mysql扩展的全栈exchange和其他站点示例,如下所示: mysql_query("START TRANSACTION"); $rollback=0 if (!mysql_query($query1)){ $rollback=1 } if (!mysql_query($query2)){ $rollback=1 } if (!mysql_query($query3)){ $rollbac

我在读mysql事务,我的印象是,为了创建事务,您必须使用mysqli或PDO。但是,我看到了使用mysql扩展的全栈exchange和其他站点示例,如下所示:

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脚本崩溃(例如我的应用服务器崩溃等),DB服务器会在设置的时间段后自动回滚事务吗

类似地,如果数据库服务器在mysql_查询(“提交”)之前崩溃,会发生什么?交易是否会“回滚”


谢谢

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

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

然而,正如Hakre所说:出于性能和互操作性的原因,mysqli是首选的
,它是PHP中推荐的mysql库。

类似地,如果数据库服务器在mysql_查询(“提交”)之前崩溃,会发生什么?交易是否会“回滚”

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

也是一笔交易

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

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


所以,除非我使用预先准备好的语句或面向对象的表示法,否则我真的没有必要切换到mysqli?为什么会有这么多的困惑呢?似乎很多人都认为不能使用mysql/ext进行事务处理。IE,如果你查找mysql和mysqli,mysqli的一个大问题似乎是事务,当它们可以使用mysql时。。。是否有一个我应该知道的“gotcha”或者人们只是粉丝?@billmarky:出于性能和互操作性的原因,你应该使用mysqli,这是PHP中推荐的mysql库。mysql(w/o The i)不再受到太多的关注,您主要是运行旧代码。@stivlo还有,如果DB服务器崩溃,您是否有点陷入困境?如中所示,事务可能会提交,也可能不取决于运气(我的印象是完美的ACID是不可能的)。@stilvo,当连接断开时,事务将始终回滚,因为在重新连接时,无论超时情况如何,都会发出回滚。您说“除非我使用准备好的语句”好像这是你不会做的事。就我个人而言,我认为准备好的语句是保护自己不受SQL操作影响的唯一真正安全的方法。当使用mysql\u real\u escape\u字符串时,很容易忘记使用它,或者天真地将它保留在您认为是整数的内容上(因为在PHP中,所有变量都是动态的)。如果您只使用准备好的语句,那么SQL注入是不可能的。