我什么时候应该使用MySQL交易?

时间:2013-08-28 19:19:14

标签: php mysql transactions

我读了一些关于何时应该使用交易的文章。我读到了:

  

我应该何时使用交易?   基本上,只要您的某个工作单元对外部更改敏感或需要能够回滚每个更改,   发生错误或其他原因。

但有人可以向我解释一下吗?

  • 我执行两个或更多时应该启动一个事务 删除/更新/插入查询?
  • 当我只有一个删除/更新/插入查询时,我还应该启动一个事务吗?
  • 我应该在一个页面上开始10次交易,或者对整个页面只开一次,或者你是否建议每页最多一次(例如5)?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

当您拥有一组彼此依赖的查询时,将使用事务。

例如,银行:

  • 银行客户“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美元。这是一种确保您可以根据需要自动撤消查询的方法。


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

    取决于查询的内容。

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

    除非你需要一种回滚(撤销)查询的方法,就像你想要进行更新并在调用commit(save)之前验证它一样。

  • 我应该在一个页面上开始10次交易,或者对整个页面只开一次,或者你是否建议每页最多一次(例如5)?

    尽可能多地开始。我怀疑你每页有多个交易,因为你很可能在每个页面加载时做一件事(即转账)。

答案 1 :(得分:1)

只要您需要执行一组相关查询,就像使用一次查询一样,就可以使用事务。

例如:

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

现在,考虑到你的观点,我没有看到使用事务执行无关查询的可靠理由(除非有特殊需要)。根据您使用的数据库引擎,您正在开发不必要的事务的系统将产生性能瓶颈。

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

关于限制每页交易量的问题,或者每页只创建一个交易,我只能说这取决于你想要实现的目标。您可能需要执行10个相关查询,这些查询应该在失败时一起回滚,然后您需要一个事务。如果您需要运行许多不相关的查询而无需回滚,则意味着您甚至不需要进行交易。

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

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