【问题标题】:What differences do I have to take into account if using MySQL Transactions?如果使用 MySQL Transactions,我必须考虑哪些差异?
【发布时间】:2011-01-01 11:26:27
【问题描述】:

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

我想知道如果我想将我的网站切换到事务,这会有多困难,我必须做出哪些改变?

另外,我使用的是 PDO,而不是 mysql_*,如果这样会有所不同吗?

【问题讨论】:

  • 代码运行得更快?从什么时候开始?
  • 当心这个人从现在开始告诉你什么。 =)
  • 是的。不要再相信这个人告诉你的任何事情了。这不是真的。
  • 嗯,不一定更快,因为它不会给服务器带来太多负载。我没有解释对。换句话说:误解交易的是我,而不是他。相信我,他对别人说的话非常小心。 ;)
  • 为什么只在页面加载时才执行查询?例如,如果您使用 PHP,则只有请求本身将执行脚本,即使用户中止连接,它也不会退出。

标签: php mysql transactions pdo


【解决方案1】:

Web 应用程序中的事务通常用于AtomicityIsolation


它们不会“阻止 MySQL 代码在整个页面加载之前执行”:当您调用 mysql_query(或使用 PDO 或 mysqli_* 的任何等效项)时,仍然会执行 MySQL 查询。但是如果你不提交事务,它们都会被“取消”。

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

注意事项:

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


在这里使用 PDO、mysql_*mysqli_* 应该没有太大区别——即使建议不要使用 mysql_* (旧的,并且不支持 MySQL 的某些功能 >= 4.1,比如prepared statements).

【讨论】:

  • 是的,我正在使用 PDO,我只是想确保有很多人仍在使用 mysql_*
【解决方案2】:

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

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

启动和完成任何事务都会产生少量开销。如果您将隐式事务用于大量更改,则会放大这一点,从而导致每个语句的开销。例如,如果您运行数千个 INSERT 语句来执行批量数据加载,这将变得很重要,每个 INSERT 隐含在一个单独的事务中。在其他情况下,使用事务与不使用事务相比的性能优势是微不足道的,尤其是在像 PHP 这样具有“无共享”架构的语言中。

【讨论】:

    【解决方案3】:

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

    如果有的话,他们会让它变慢。我建议你在得出这样的结论之前对交易做更多的研究。

    【讨论】:

      【解决方案4】:

      我不知道 MySQL 的事务速度,但在 SQLite 中使用事务通常更快,但我相信在 MySQL 中它们应该会减慢您的速度。

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

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

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

      【讨论】:

      • mysqlnd 不是 php 扩展。
      猜你喜欢
      • 2011-10-30
      • 2021-04-26
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2015-12-25
      相关资源
      最近更新 更多