【发布时间】:2010-09-08 19:02:25
【问题描述】:
我在 asp.net 中写了一个非常简单的e-commerce app,我需要在我的存储过程中使用事务吗?
读/写比例约为 9:1
【问题讨论】:
标签: sql asp.net sql-server e-commerce
我在 asp.net 中写了一个非常简单的e-commerce app,我需要在我的存储过程中使用事务吗?
读/写比例约为 9:1
【问题讨论】:
标签: sql asp.net sql-server e-commerce
很多人问 - 我需要交易吗?为什么我需要它们?什么时候使用它们?
答案很简单:一直使用它们,除非您有充分的理由不使用(例如,不要将原子事务用于企业之间的“长时间运行的活动”)。默认值应始终为是。你有疑问吗? - 使用交易。
为什么交易是有益的?它们可以帮助您处理崩溃、故障、数据一致性、错误处理,它们可以帮助您编写更简单的代码等。而且随着时间的推移,好处列表将继续增长。
这里有更多来自http://blogs.msdn.com/florinlazar/的信息
【讨论】:
请记住,在 SQL Server 中,默认情况下,所有单语句 CRUD 操作都在隐式事务中。如果您需要将多个语句作为一个原子单元,您只需要打开显式事务 (BEGIN TRAN)。
【讨论】:
答案是,视情况而定。您并不总是需要交易安全。有时它是矫枉过正的。有时不是。
我可以看到,例如,当您实施结帐流程时,您只想在收集所有数据后完成它等等。想想付款失败,您可以回滚 - 这是您需要时的示例一笔交易。或者在明智的时候使用它们。
创建新用户帐户时是否需要交易?也许,如果它跨越 10 个表(无论出于何种原因),如果它只是一个表,那么可能不会。
这还取决于您向客户出售的产品以及他们是谁,以及他们是否提出要求等。但如果由您决定,那么我会说,明智地选择。
我的底线是,避免过早优化。构建您的应用程序,请记住,您可能希望稍后在需要时返回并重构/优化。看看几个开源项目,看看他们如何实现应用程序的不同部分,从中学习。你会看到他们中的大多数根本不使用交易,但是有大量的在线商店使用它们。
【讨论】:
当然,这取决于。
这取决于特定存储过程执行的工作,并且可能与您建议的“读/写比率”无关。通常,如果查询可能会受到其他一些同时运行的查询的影响,您应该考虑在事务中包含一个工作单元。如果这听起来不确定,那就是。通常很难预测在什么情况下某个特定的工作单元有资格成为此候选者。
一个好的开始是查看在工作单元中执行的精确CRUD,在这种情况下是在您的存储过程中,并确定它是否 a) 可能受到其他一些同时操作的影响和 b)如果其他工作对正在执行的工作的最终结果很重要(或者,反之亦然)。如果对这两个问题的回答都是“是”,那么请考虑将工作单元包装在事务中。
这表明您不能总是简单地决定使用或不使用事务,而是应该在有意义的时候应用它们。使用ACID 定义的属性(原子性、一致性、隔离性和持久性)来帮助确定何时可能出现这种情况。
要考虑的另一件事是,在某些情况下,特别是如果系统必须快速连续执行许多操作,例如大容量事务处理应用程序,您可能需要权衡事务的相对性能成本。根据工作单元的大小,事务的提交(或回滚)可能会耗费大量资源,可能会对系统性能产生不必要的负面影响,或者至少收益有限。
不幸的是,这不是一个容易准确回答的问题:“这取决于。”
【讨论】:
在以下情况下使用它们:
【讨论】: