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

发布于 2024-12-07 17:03:23 字数 595 浏览 1 评论 0原文

我正在阅读有关 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 脚本崩溃(即我的应用程序服务器崩溃等)会发生什么,数据库服务器是否会在设定的时间段后自动回滚事务?

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

谢谢!

I was reading about mysql transactions and I was under the impression that you had to use either mysqli or PDO in order to create transactions. However, I see all over stack exchange and other sites examples that use the mysql extension like this:

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");
}

What is the difference between doing it this way and using the "special" mysqli specific functions mysqli::rollback and mysqli::commit?

Also, what happens if the php script crashes (IE my app server crashes etc), does the DB server automatically rollback the transaction after a set timeperiod?

Similarly, what happens if the DB server crashes before mysql_query("COMMIT")? Would the transaction be "rolled back"?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2024-12-14 17:03:23

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

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

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

同样,如果数据库服务器在 mysql_query("COMMIT") 之前崩溃,会发生什么情况?交易会被“回滚”吗?

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

另外,事务可以回滚,因为它无法获取在一定的超时时间内锁定

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

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

It's also perfectly legal and is using MySQL statements directly to implement transaction.

And frankly, I don't see any improvements by using the mysqli syntax. It's a failed abstraction since it maps 1:1 on MySQL only. It would make more sense to use the higher level syntax in PDO, since it will map with a different syntax according to the underlying DB.

However, as Hakre says: mysqli is preferred for performance and interoperability reasons, it's the recommended mysql lib in PHP.

Similarly, what happens if the DB server crashes before mysql_query("COMMIT")? Would the transaction be "rolled back"?

It's easier that an application program crashes rather than a DB server. Any non committed transaction will be rolled back.

Also a transaction can be rolled back because it can't acquire a lock within a certain timeout.

The timeout in seconds an InnoDB transaction may wait for a row lock before giving up. The default value is 50 seconds. A transaction that tries to access a row that is locked by another InnoDB transaction will hang for at most this many seconds before issuing the following error:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文