Php 如果使用MySQL事务,我必须考虑哪些差异?

Php 如果使用MySQL事务,我必须考虑哪些差异?,php,mysql,transactions,pdo,Php,Mysql,Transactions,Pdo,最近有人告诉我,我应该在我的应用程序中使用事务,因为它们可以帮助更快地运行代码,并防止在整个页面加载之前执行MySQL代码(例如,如果有人正在刷新我的页面,而整个页面没有加载,则不会启动MySQL调用,从而减少服务器上的负载) 我想知道我是否想把我的网站切换到交易,这有多困难,我需要做什么改变 另外,我使用的是PDO,而不是mysql,如果这有什么区别的话?在web应用程序中,事务通常用于和 它们不会“阻止MySQL代码在整个页面加载之前执行”:当您调用MySQL\u query(或者使用PD

最近有人告诉我,我应该在我的应用程序中使用事务,因为它们可以帮助更快地运行代码,并防止在整个页面加载之前执行MySQL代码(例如,如果有人正在刷新我的页面,而整个页面没有加载,则不会启动MySQL调用,从而减少服务器上的负载)

我想知道我是否想把我的网站切换到交易,这有多困难,我需要做什么改变


另外,我使用的是PDO,而不是mysql,如果这有什么区别的话?

在web应用程序中,事务通常用于和


它们不会“阻止MySQL代码在整个页面加载之前执行”:当您调用
MySQL\u query
(或者使用PDO或
mysqli.*
)时,仍然会执行MySQL查询。但如果您不提交事务,它们都将被“取消”

它们也与帮助“更快地运行代码”没有多大关系;即使它们有时会产生这种效果,这只是因为如果不显式地将一个事务用于一组查询(只产生一个事务),MySQL将隐式地为每个查询使用一个事务(产生多个事务,这可能会给DB服务器带来一些额外的负载)

注:

  • 当然,这是使用一个支持事务的DB引擎——比如InnoDB
  • 关于“更快”一点,我已经看过好几次了;但这是在特殊情况下,我比ACID更需要速度——或者这只是服务器负载的问题(这意味着如果你想走这条路,你必须分析,知道在你的特定情况下什么更快!)


在这里,使用PDO、
mysql\u*
mysqli\u*
应该没有多大区别——即使建议不要使用
mysql\u*
(旧的,并且不支持mysql>=4.1的某些功能,例如预处理语句)。

事务提供ACID,而不是让您的“代码更快”


如果有的话,他们会让它慢下来。在得出这样的结论之前,我建议您对事务进行更多的研究。

实际上,当您使用RDBMS时,您已经在使用事务了。但是,除非您明确说明事务的开始和结束时间,否则您将隐式地允许每个SQL语句开始和完成一个单独的事务。这也称为“自动提交”

事务是通过多个SQL语句进行逻辑更改的好工具,因此您可以作为一个单元提交或回滚整个更改集,并确保您的更改使数据库保持一致状态。事务的主要目的不是提高性能


启动和完成任何事务都需要少量开销。如果使用隐式事务进行大量更改,则会放大这种情况,从而导致每条语句的开销。例如,如果您运行数千条
INSERT
语句来执行批量数据加载,每个
INSERT
语句都隐式地在一个单独的事务中,那么这一点就变得非常重要。在其他情况下,使用事务相对于不使用事务的性能优势微不足道,特别是在PHP这样的“不共享”体系结构的语言中。

我不知道MySQL的事务速度,但在SQLite中,使用事务通常更快,然而,我相信在MySQL中,它们会让你慢下来

关于你需要做的改变,嗯。。。几乎没有:

BEGIN TRANSACTION
$result = [execution of several queries]
if $result fails -> ROLLBACK, else COMMIT

我还建议您在mysqli或mysql上使用PDO。

代码运行得更快吗?从什么时候开始?小心这个人从现在开始对你说的话。=)嗯。别再相信这家伙告诉你的任何事了。这不是真的。好吧,不一定更快,因为这只是因为它不会给服务器带来太多的负载。我解释得不对。换句话说:曲解交易的是我,而不是他。相信我,他对别人说的话很小心为什么只希望在页面加载时执行查询?例如,如果您使用的是PHP,则仅请求本身将执行脚本,即使用户中止连接,它也不会退出。mysqlnd不是一个PHP扩展。是的,我使用的是PDO,我只是想确保许多人仍然使用
mysql\uqlnd