【问题标题】:When should I use MySQL transactions?什么时候应该使用 MySQL 事务?
【发布时间】:2013-08-28 19:19:14
【问题描述】:

我阅读了一些关于何时应该使用事务的文章。我读到:

我应该什么时候使用事务? 基本上,只要您有一个工作单元对外部更改敏感或需要能够回滚每个更改,如果 发生错误或其他原因。

但是谁能更好地解释给我听?

  • 我是否应该在执行两个或多个时启动事务 删除/更新/插入查询?
  • 当我只有一个删除/更新/插入查询时,我是否也应该启动事务?
  • 我应该在一个页面上启动 10 次事务,还是最好只为整个页面启动一次,或者您是否建议为每个页面设置一个最大值(例如 5 次)?

感谢您的帮助!

【问题讨论】:

    标签: php mysql transactions


    【解决方案1】:

    当您有一组相互依赖的查询时使用事务。

    例如银行:

    • 银行客户“John”将 100 美元转入“Alice”的账户。
    • 对于此示例,有 2 个查询(我没有显示日志记录或事务历史...等)。您需要从 John 的余额中扣除 100 美元,然后将其添加到 Alice 的余额中。
    • Start transaction
    • 从约翰那里扣除
      • UPDATE accounts SET balance=balance-100 WHERE account='John'
    • 添加到爱丽丝
      • UPDATE accounts SET balance=balance+100 WHERE account='Alice'
    • commit

    在您提交之前不会保存事务。因此,如果任一查询中出现错误,您可以调用rollback 并撤消自事务启动以来已运行的任何查询。如果由于某种原因向 Alice 添加 100 美元的查询失败,您可以回滚而不从 John 扣除 100 美元。这是一种确保您可以在需要时自动撤消查询的方法。


    • 我应该在执行两个或多个删除/更新/插入查询时启动事务吗?

      取决于查询在做什么。

    • 当我只有一个删除/更新/插入查询时,我是否也应该开始事务?

      没有必要,除非您需要一种方法来回滚(撤消)查询,就像您想在调用提交(保存)之前进行更新和验证一样。

    • 我应该在一个页面上启动 10 次交易,还是对整个页面只启动一次更好,或者您是否建议为每个页面设置一个最大值(例如 5 次)?

      根据需要开始。我怀疑您每页有多个交易,因为您很可能在每个页面加载时都做一件事(即转账)。

    【讨论】:

    • 感谢您的帮助。关于第二点,我只有一个问题。验证是什么意思?当我进行更新时,我为什么要验证?我的意思是:当查询不成功时,不需要回滚,因为它只是一个查询?
    • +1 事务用于查询/语句组。如果您只有一个甚至多个不相互依赖的,那么您不需要事务。
    • @Jordy 这只是一个例子。可能是不好的例子。如果您要运行将列更新为执行一些复杂计算的子查询的更新查询。您可以运行更新,选择值,检查它是否是您所期望的,如果它不是回滚。
    【解决方案2】:

    当您需要执行一组相关查询时,您可以使用事务,就好像它只是一个查询一样。

    例如:

    在购物车中有人广告产品,您更新商店库存(减少存在),并更新客户的购物车(增加购物车上的产品)。在这种情况下,会发生 2 次操作,这就是您创建交易的原因,如果其中一个查询失败(商店中的产品不足),则不应发生第二次查询(将产品添加到客户的购物车)。在这种情况下,这 2 个查询符合一个工作单元,这意味着数据库应该同时处理或不处理。

    现在,考虑到您的观点,我认为没有充分的理由使用事务来执行不相关的查询(除非有特殊需要)。根据您使用的数据库引擎,以及您正在开发不必要事务的系统会造成性能瓶颈。

    另一方面,在某些应用程序中,您可能需要执行多个事务,但您应该根据具体情况决定,因为没有一般规则。

    关于您对限制每页的交易量或每页只创建一个交易的担忧,我只能说这取决于您要完成的任务。您可能需要执行 10 个相关查询,在失败时应该一起回滚,然后您需要一个事务。如果您需要运行许多不相关的查询而不需要回滚,则意味着您甚至不需要事务。

    您也可以查看维基百科关于此主题的条目:

    http://en.wikipedia.org/wiki/Database_transaction

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2011-04-15
      • 2017-04-10
      • 2012-03-19
      • 2018-05-12
      • 2018-12-11
      相关资源
      最近更新 更多