【问题标题】:Sql Transaction - SQL Server or C#?Sql 事务 - SQL Server 还是 C#?
【发布时间】:2011-05-21 13:41:17
【问题描述】:

我说得对吗?从性能的角度来看,存储过程中的 sql 事务要比代码好得多?

目前我在存储过程中使用我的大部分事务,但有时我将代码用于更复杂的例程 - 显然我尽可能地保持在最低限度。

只是有一个复杂的例程需要太多的“变量”,用c#编写sql事务比使用SQL Server容易得多。这是代码可读性和性能之间的一条细线。

有什么想法吗?

【问题讨论】:

标签: c# sql-server transactions


【解决方案1】:

代码中的事务管理(阅读 c#)是一个选项,可用于管理多个数据源或系统上的事务。对于单个数据库的事务管理,服务器端的管理总是会比较简单。但是,如果您认为代码可能需要满足在事务中添加多个数据源的情况,请将事务保留在代码级别。

【讨论】:

  • 关于多个数据库的要点。我使用的大多数事务(如果不是所有事务)确实都使用一个数据库......所以也许用 sql server 构建所有事务。谢谢。
  • 是的,那样的话你可以在服务器端做。
【解决方案2】:

我相信存储过程会有更好的性能。

【讨论】:

    【解决方案3】:

    性能各不相同; SqlTransaction 的开销可能比 TransactionScope 少,尤其是当 TransactionScope 决定需要与 DTC 纠缠时。但我不希望SqlTransactionBEGIN TRAN 之间有巨大 的差异,除了额外的往返行程。但是,TransactionScope 仍然很快,并且是在事务中封装多个操作的最方便的选项,因为环境事务不需要每次都手动与命令关联。

    isolation-level 可能是一个更好(也更重要)的因素。 TransactionScope 默认为最高(可序列化)。较低的隔离级别允许更多的阻塞(但存在不可重复读取等风险)。 IIRC TSQL 事务默认为较低级别之一。但是可以针对所有 3 个选项调整隔离级别。

    【讨论】:

    • 老实说,我几乎总是在 store procs 中使用事务,而不是在 c# ado.net 中经常使用。因此,TransactionScope 对我来说是新的,我很高兴你提到了这一点。看来我需要了解一下。
    【解决方案4】:

    如果您的意思是您用 C# 编写 SQL 事务并使用 ADO.Net 或类似方法来执行它们,那么它们可能效率较低,因为 SQL 将缓存存储过程的查询计划(现在实体框架也是如此 -虽然仍然没有我认为的 proc 快)所以实际上你可能应该反过来做 - SQL 中的复杂过程以获得缓存的好处(如果它是那么简单......)

    【讨论】:

    • 是 C# 中的 Sql 事务并使用 ADO .NET。我忘了缓存。谢谢
    • 话虽如此,我现在不确定它是否也不会缓存 C# 查询的查询计划,有一些技巧可以让 EF 缓存(我认为它具有固定的列长度或某些东西),因此也可能适用于 ADO.Net 查询 - 但是我相信这仅适用于 SQL 2008
    • 查询计划被缓存并重复使用,无需存储过程
    • @marc 感谢您提供的信息——除此之外,为什么围绕 EF1 进行如此多的讨论却没有这样做?为什么 EF4 具有打开和关闭它的功能?
    • @EF1 - 我需要查看具体的参考资料;这可能意味着内部 EF 查询编译(这与 TSQL 位置重用是分开的),或者它可能是带有字符串之类的参数的 foobar 导致缓存未命中(即具有 varchar(11) 参数和 varchar 的相同查询(5) 参数,因为查询中的值是 11 对 5 个字符长,如果你明白我的意思)
    【解决方案5】:

    这取决于什么应用程序。

    但我会说,在大多数情况下,最好让数据库中有逻辑感到惊讶。在数据库中拥有业务逻辑的一个非常有利的地方是,即使您拥有 WinForms 版本和 Web 或其他任何内容,它也将是相同的

    但是,如果您谈论的是 SQL 中的 CLR。不利的是,DBA 发现任何错误或相关问题变得更加困难。性能。

    【讨论】:

    • 好点。我读到 CLR 的性能更好,但 oyu 说发现错误是一个主要问题。
    【解决方案6】:

    我支持TransactionScope。按照 Marc 的说法,在您的 TransactionScope 上使用工厂方法将隔离级别降低到 READ COMMITTED,这是我能想到的最常见的用法。

    请注意,您可以同时使用 SQL 事务和 TransactionScope - SQL BEGIN TRAN / COMMIT TRANTransactionScope 几乎没有影响(除了增加/减少 @@TRANCOUNT) - 如果您确实需要,可以这样在别处调用相同的 SQL Sproc,例如从即席查询中,您仍将受益于事务。

    TransactionScopeIMO 的好处是,如果您确实需要进行 2 阶段提交(例如,多个数据库、队列或其他 XA 事务),它将为您管理 DTC。对于 SQL 2005 及更高版本,它与 Lightweight Transaction Manager 一起使用,因此不需要 DTC,例如如果所有访问都针对一个数据库,则一次连接一个。

    【讨论】:

    • 现在我已经阅读了更多关于 TransactionScope 和隔离级别的内容,我很高兴我提出了这个问题。我不会提前 5-10 分钟理解你的 cmets :) 但现在就去做。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多