1

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

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

但是有人可以更好地向我解释吗?

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

谢谢你的帮助!

4

2 回答 2

7

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

以银行为例:

  • 银行客户“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 个)?

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

于 2013-08-28T19:41:58.787 回答
2

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

例如:

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

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

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

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

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

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

于 2013-08-28T19:50:08.067 回答