【问题标题】:Do I really need to use transactions in stored procedures? [MSSQL 2005]我真的需要在存储过程中使用事务吗? [MSSQL 2005]
【发布时间】:2010-09-08 19:02:25
【问题描述】:

我在 asp.net 中写了一个非常简单的e-commerce app,我需要在我的存储过程中使用事务吗?

读/写比例约为 9:1

【问题讨论】:

    标签: sql asp.net sql-server e-commerce


    【解决方案1】:

    很多人问 - 我需要交易吗?为什么我需要它们?什么时候使用它们?

    答案很简单:一直使用它们,除非您有充分的理由不使用(例如,不要将原子事务用于企业之间的“长时间运行的活动”)。默认值应始终为是。你有疑问吗? - 使用交易。

    为什么交易是有益的?它们可以帮助您处理崩溃、故障、数据一致性、错误处理,它们可以帮助您编写更简单的代码等。而且随着时间的推移,好处列表将继续增长。

    这里有更多来自http://blogs.msdn.com/florinlazar/的信息

    【讨论】:

    • “一直使用它们,除非你有充分的理由不这样做”这就像告诉人们一直戴头盔,除非他们有充分的理由不这样做。
    • 这是假设使用事务在任何方面都很烦人或荒谬,我认为情况并非如此。
    • 我认为@Jeff Atwood 在得出戴头盔的结论之前没有阅读完整的段落。
    • “我走路时通常不会摔倒”是不戴头盔的一个非常好的和明智的理由。 “我使用 ORM 来处理我长期运行的业务活动的乐观锁定”是不使用(长期存在的)事务的一个非常好的和明智的理由。 “我不知道”不是个好理由。
    • @David 我相信 Codeslayer 的主要信息是从假设您需要它们开始,并寻找不使用它们的理由。这些原因是什么?弗洛林展示了一些。如果你不知道你的代码表现如何,那么你遇到的问题比交易的使用与否更糟糕
    【解决方案2】:

    请记住,在 SQL Server 中,默认情况下,所有单语句 CRUD 操作都在隐式事务中。如果您需要将多个语句作为一个原子单元,您只需要打开显式事务 (BEGIN TRAN)。

    【讨论】:

      【解决方案3】:

      答案是,视情况而定。您并不总是需要交易安全。有时它是矫枉过正的。有时不是。

      我可以看到,例如,当您实施结帐流程时,您只想在收集所有数据后完成它等等。想想付款失败,您可以回滚 - 这是您需要时的示例一笔交易。或者在明智的时候使用它们。

      创建新用户帐户时是否需要交易?也许,如果它跨越 10 个表(无论出于何种原因),如果它只是一个表,那么可能不会。

      这还取决于您向客户出售的产品以及他们是谁,以及他们是否提出要求等。但如果由您决定,那么我会说,明智地选择。

      我的底线是,避免过早优化。构建您的应用程序,请记住,您可能希望稍后在需要时返回并重构/优化。看看几个开源项目,看看他们如何实现应用程序的不同部分,从中学习。你会看到他们中的大多数根本不使用交易,但是有大量的在线商店使用它们。

      【讨论】:

        【解决方案4】:

        当然,这取决于。

        这取决于特定存储过程执行的工作,并且可能与您建议的“读/写比率”无关。通常,如果查询可能会受到其他一些同时运行的查询的影响,您应该考虑在事务中包含一个工作单元。如果这听起来不确定,那就是。通常很难预测在什么情况下某个特定的工作单元有资格成为此候选者。

        一个好的开始是查看在工作单元中执行的精确CRUD,在这种情况下是在您的存储过程中,并确定它是否 a) 可能受到其他一些同时操作的影响和 b)如果其他工作对正在执行的工作的最终结果很重要(或者,反之亦然)。如果对这两个问题的回答都是“是”,那么请考虑将工作单元包装在事务中。

        这表明您不能总是简单地决定使用或不使用事务,而是应该在有意义的时候应用它们。使用ACID 定义的属性(原子性、一致性、隔离性和持久性)来帮助确定何时可能出现这种情况。

        要考虑的另一件事是,在某些情况下,特别是如果系统必须快速连续执行许多操作,例如大容量事务处理应用程序,您可能需要权衡事务的相对性能成本。根据工作单元的大小,事务的提交(或回滚)可能会耗费大量资源,可能会对系统性能产生不必要的负面影响,或者至少收益有限。

        不幸的是,这不是一个容易准确回答的问题:“这取决于。”

        【讨论】:

          【解决方案5】:

          在以下情况下使用它们:

          1. 您可能想要测试和捕获一些错误,除非您出去执行工作(查找、测试值等),通常是在事务中,这样才能发现这些错误您可以回滚整个操作。
          2. 存在任何类型的多步操作,从逻辑上讲,如果它们失败,则应作为一个组回滚。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-10
            • 2017-12-30
            • 2011-11-22
            • 1970-01-01
            • 2012-03-26
            • 2017-10-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多