SQL事务 - SQL Server还是C#?

7

我说的对吗?从性能角度来看,与代码相比,sql事务在存储过程中更好吗?

目前,我大多数事务都在存储过程中使用,但有时我会使用代码进行更复杂的例程-尽可能将其保持最小。

只是有一个复杂的例程需要太多“变量”,用C#编写SQL事务比使用SQL Server更容易。这是代码可读性和性能之间的微妙平衡。

有什么想法吗?


1
请参阅:https://dev59.com/dHVC5IYBdhLWcg3wpS7g - Marc Gravell
顺便提一句:它是存储过程——在SQL Server中被称为存储,而不是存储过程——只是一个小问题。 - marc_s
哦,是的。使用缩写“store proc”,谢谢 Marc_s。 - Rob
6个回答

7
性能有所不同;一个SqlTransaction的开销可能比一个TransactionScope要小,特别是当TransactionScope决定需要与DTC纠缠在一起时。但我不会期望SqlTransactionBEGIN TRAN之间有很大的区别,除了额外的往返。然而,TransactionScope仍然很快,并且是封装多个操作在事务中最方便的选项,因为环境事务不需要每次手动关联命令。

也许一个更好(并且更重要)的因素是隔离级别isolation-levelTransactionScope默认为最高级别(可序列化)。较低的隔离级别允许更少的阻塞(但存在非可重复读等风险)。我IRC TSQL事务默认为较低的级别之一。但是所有3个选项的隔离级别都可以进行调整。


我坦率地说,我几乎总是在存储过程中使用事务,而在C# ADO.NET中很少使用。因此,TransactionScope对我来说是新的,我很高兴你提到了它。看起来我需要了解一下这个。 - Rob

2

我推荐使用TransactionScope。根据Marc的建议,对于我所想到的大多数常见用途,可以在TransactionScope上使用工厂方法将隔离级别降低到READ COMMITTED

请注意,您可以同时使用SQL事务和TransactionScope - SQL的BEGIN TRAN / COMMIT TRANTransactionScope的影响很小(除了增加/减少@@TRANCOUNT)- 这样,如果您需要从其他地方调用相同的SQL Sproc,例如从adhoc查询中,您仍将获得事务的好处。

我认为TransactionScope的好处是,如果您确实需要执行2阶段提交(例如,多个数据库,队列或其他XA事务),它将为您管理DTC。而且,对于SQL 2005及更高版本,它与轻量级事务管理器一起使用,因此如果所有访问都针对一个数据库,每次只使用一个连接,则不需要DTC。


现在我已经更多地了解了TransactionScope和隔离级别,我很高兴提出了这个问题。5-10分钟前我可能不会理解你的评论 :) 但现在我明白了。感谢您的回复。 - Rob

1

代码(阅读 c#)中的事务管理是一种选项,用于管理跨多个数据源或系统的事务。对于单个数据库的事务管理,服务器端的管理始终更简单。但如果您认为代码可能需要适应涉及多个数据源的情况,请在代码级别保留事务。


多个数据库的好处说得很好。我使用的大部分交易确实都是与一个数据库进行的...因此也许应该将所有交易结构化为SQL Server。谢谢。 - Rob
可以在服务器端完成。 - Kangkan

1

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


1

如果你的意思是在C#中编写SQL事务并使用ADO.Net或类似工具来执行它们,那么它们可能不太高效,因为SQL将缓存存储过程的查询计划(虽然现在Entity Framework也是如此,但我认为仍然不如存储过程快),所以你应该反过来做 - 在SQL中编写复杂的存储过程以获得缓存优势(如果只是这么简单就好了...)


是的,C#中有Sql事务并使用ADO .NET。我忘记了缓存。谢谢。 - Rob
说了这么多,我现在不确定它是否也会缓存C#查询的查询计划,有一些技巧可以让EF缓存(我认为是固定列长度或其他什么),因此ADO.Net查询也可能适用 - 但我相信这仅适用于SQL 2008。 - Rob
查询计划被缓存并重复使用,无需存储过程。 - Marc Gravell
@marc 谢谢你的信息 - 那么为什么EF1没有这样做会有这么多讨论?而EF4为什么有开启和关闭此功能的功能呢? - Rob
@EF1 - 我需要看到具体的参考资料;这可能意味着内部 EF 查询编译(与 TSQL 位置重用分开),或者可能是类似字符串作为参数导致缓存未命中的 foobar(即,使用 varchar(11)参数和 varchar(5)参数的相同查询,因为查询中的值长度为 11 vs 5 字符,如果你明白我的意思)。 - Marc Gravell

1

这取决于应用程序。

但我会说,在大多数情况下,最好在数据库中具有逻辑。在数据库中具有业务逻辑也非常有优势,因为即使您拥有WinForms版本和Web版本等不同版本,它也将是相同的。

但是,如果您谈论SQL中的CLR,则负面影响是,DBA更难找到任何错误或性能问题。


好的观点。我看过关于CLR表现更好的文章,但正如你所说,发现错误是一个重大问题。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接