我真的需要在存储过程中使用事务吗? [MSSQL 2005]

时间:2008-09-13 08:45:16

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

我在 asp.net 中写了一个非常直截了当的e-commerce app,我是否需要在我的存储过程中使用事务?

读/写比率约为9:1

5 个答案:

答案 0 :(得分:7)

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

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

为什么交易有益?它们可以帮助您处理崩溃,故障,数据一致性,错误处理,它们可以帮助您编写更简单的代码等。并且利益列表将继续增长。

以下是来自http://blogs.msdn.com/florinlazar/

的更多信息

答案 1 :(得分:3)

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

答案 2 :(得分:1)

答案是,这取决于。您并不总是需要交易安全。有时它太过分了。有时它不是。

我可以看到,例如,当您实施结帐流程时,您只想在收集所有数据等后最终确定它。想想付款,你可以回滚 - 这是你需要的一个例子交易。或者也许在使用它们时是明智的。

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

这还取决于你卖给你的客户是什么以及他们是谁,以及他们是否要求等等。但是如果做出决定取决于你,那么我会说,明智地选择。

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

答案 3 :(得分:1)

当然,这取决于。

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

一个好的起点是检查在工作单元内执行的精确CRUD,在这种情况下,在您的存储过程中,并确定它是否a)可能受到其他一些同时操作和b)如果其他工作对于正在进行的这项工作的最终结果是重要的(或者,甚至反之亦然)。如果这两个答案都是“是”,那么考虑在事务中包装工作单元。

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

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

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

答案 4 :(得分:0)

在以下情况下使用它们:

  1. 您可能想要测试一些错误并捕获哪些错误,除非您外出并完成工作(查找内容,测试值等),通常是在事务中,以便你可以回滚整个操作。
  2. 有任何类型的多步骤操作,如果失败,这些操作在逻辑上应该作为一个组回滚。