在存储过程或应用程序中处理事务的最佳位置在哪里?

时间:2009-04-03 21:18:55

标签: c# sql transactions

当我的C#.net应用程序更新多个表中的记录时,我使用事务,因此如果在事务期间任何事情发生故障我可以回滚。

哪一个是更好的做法?

- 使用BEGIN TRANSACTION / ROLLBACK / COMMIT TRANSACTION存储过程; - 在应用程序中使用TransactionScope如下:


    using (TransactionScope ts = new TransactionScope())
    {
    }

6 个答案:

答案 0 :(得分:4)

这不是业务逻辑问题,它是一个数据完整性问题,我觉得可以在存储过程中执行。我希望将事务逻辑保持尽可能接近操作,以缩短其持续时间。

答案 1 :(得分:3)

TransactionScope是一种非常好的方法来管理代码中的事务。它允许您跨多个方法嵌套交易代码,并在必要时自动扩展到分布式模式。

我更喜欢使用TransactionScope而不是存储过程事务,因为它可以让你在代码中有更多的控制权。

答案 2 :(得分:1)

或者你可以在两者中做到。检查链接:http://www.4guysfromrolla.com/webtech/080305-1.shtml

答案 3 :(得分:1)

如果你的交易是去一个数据库,那么最好在存储过程中进行交易。另一种方式只能由后勤问题引起(DBA不喜欢你,或者他正在度假)。 如果在一个事务中调用不同的事务源(SQL Server和Oracle),那么除了在代码中执行事务之外别无选择。

答案 4 :(得分:1)

我强烈建议为页面设置一个过程并在那里管理所有sql操作。如果要在多个过程的页面上执行多个任务,只需要一个过程来管理其他过程。如果需要,您的处理可以始终返回多个记录集。

  • 您的页面执行速度会更快 - 不是 大量数据来回传递, 只拉一个。 sql上的所有代码都已经使用执行计划编译。
  • 你将能够 更多地处理你的错误 有效 - 在一个地方而不是相反 在两个地方 - 有两个 单独的系统来决定它是否是 足以失败 - 通过任何 错误来回维持 您的数据完整性。
  • 您可以最大限度地减少失败点。 如果交易进展顺利,但是 Web服务器打嗝,sql 服务器等待了 响应。
  • 您将节省大量时间进行故障排除和调试。
  • 它将有助于在sql server上模块化您的代码。您可以重用sprocs来执行类似的任务,最终得到一个更易于扩展的可扩展系统。 HTH

答案 5 :(得分:1)

以下是关于何时使用交易的2条简单规则:

  • 如果程序有多个数据更改语句,则它将包含一个事务。
  • 如果应用程序调用多个更改数据的存储过程,则它将包含一个事务。