Sql事务-Sql Server或C#?
从性能角度看,存储过程中的sql事务比代码好得多,我说的对吗 目前,我在存储过程中使用了大部分事务,但有时我会将代码用于更复杂的例程——显然,我会尽可能地将代码保持在最低限度 只是有一个复杂的例程需要太多的“变量”,用c#编写sql事务比使用sql Server容易得多。这是代码可读性和性能之间的一条细线Sql事务-Sql Server或C#?,c#,sql-server,transactions,C#,Sql Server,Transactions,从性能角度看,存储过程中的sql事务比代码好得多,我说的对吗 目前,我在存储过程中使用了大部分事务,但有时我会将代码用于更复杂的例程——显然,我会尽可能地将代码保持在最低限度 只是有一个复杂的例程需要太多的“变量”,用c#编写sql事务比使用sql Server容易得多。这是代码可读性和性能之间的一条细线 有什么想法吗?代码中的事务管理(读c#)是管理多个数据源或系统上的事务的一个选项。对于管理单个数据库的事务,服务器端的管理总是更简单。但是,如果您认为代码可能需要满足在事务中添加多个数据源的场
有什么想法吗?代码中的事务管理(读c#)是管理多个数据源或系统上的事务的一个选项。对于管理单个数据库的事务,服务器端的管理总是更简单。但是,如果您认为代码可能需要满足在事务中添加多个数据源的场景,请将事务保持在代码级别。我相信存储过程将具有更好的性能。性能会有所不同;
SqlTransaction
的开销可能比TransactionScope
小,特别是当TransactionScope
决定需要与DTC纠缠时。但是我不希望SqlTransaction
和BEGIN-TRAN
之间有太大的区别,除了额外的往返行程。但是,TransactionScope
仍然很快,并且是在事务中封装多个操作的最方便的选项,因为环境事务不需要每次手动与命令关联
也许一个更好(更重要)的因素是<代码>事务范围默认为最高值(可序列化)。较低的隔离级别允许更少的阻塞(但存在不可重复读取等风险)。IIRC TSQL事务默认为较低级别之一。但是对于所有3个选项,隔离级别都可以调整。如果你是说用C#编写SQL事务,并使用ADO.Net或类似工具来执行它们,那么它们的效率可能会更低,因为SQL会缓存存储过程的查询计划(现在对于Entity Framework也是如此-尽管我认为还不如proc那么快)因此,实际上您可能应该换一种方式来做—SQL中的复杂过程可以获得缓存好处(如果它这么简单的话…)这取决于应用程序 但我要说的是,在大多数情况下,最好是对数据库中的逻辑感到惊讶。数据库中有业务逻辑的另一个非常有利之处是,即使您有WinForms版本和web,或者其他什么,它也将是相同的
但是如果你说的是SQL中的CLR。消极的是,DBA很难发现任何错误或与之相关的东西。性能。我支持
TransactionScope
。根据Marc,在您的TransactionScope
上使用工厂方法将隔离级别降至READ COMMITTED
,这是我能想到的最常见的用法
请注意,您可以同时使用SQL事务和TransactionScope
-SQLBEGIN TRAN
/COMMIT TRAN
对TransactionScope
几乎没有影响(除了递增/递减@@TRANCOUNT
)-如果您确实需要在其他地方调用相同的SQL存储过程,例如,通过临时查询,您仍然可以从交易中获益
TransactionScope
IMO的好处是,如果您确实需要执行两阶段提交(例如多个数据库、队列或其他XA事务),它将为您管理DTC。对于SQL 2005及更高版本,它与一起工作,因此不需要DTC,例如,如果所有访问都是一次访问一个数据库,一次连接一个连接。多个数据库的优点是。我使用的大多数事务(如果不是所有的话)实际上都与一个数据库有关。。。因此,也许可以使用sql server构造所有事务。谢谢。是的,在这种情况下,你可以在服务器端完成。是的,在C#中使用Sql事务并使用ADO.NET。我忘了缓存。Thankswing说了这一点,我现在不确定它是否也会缓存C#查询的查询计划,让EF缓存有一些技巧(我认为它有固定的列长度或其他东西)因此,这可能也适用于ADO.Net查询,但我相信这仅适用于SQL 2008查询计划,查询计划被缓存并重新使用,而无需存储procedures@marc感谢您提供的信息-更进一步,为什么有那么多关于EF1不这样做的讨论?为什么EF4有打开和关闭它的功能?@EF1-我需要看看具体的参考资料;这可能意味着内部EF查询编译(独立于TSQL place重用),也可能是foobar,其中的字符串等参数导致缓存未命中(即,使用varchar(11)参数和varchar(5)参数执行相同的查询,因为查询中的值是11对5个字符长,如果您明白我的意思的话)老实说,我几乎总是在存储过程中使用事务,而在c#ado.net中不太常见。因此,交易范围对我来说是新的,我很高兴你提到这一点。看起来我需要读一下。另请看:这是存储过程-存储在SQL Server中-不是存储过程-只是吹毛求疵…哦,是的。使用简写的“存储过程”,谢谢marc_。我读过关于CLR性能更好的文章,但正如oyu所说的,发现错误是一个主要问题。现在我读了更多关于TransactionScope和隔离级别的文章,我很高兴我提出了这个问题。我不可能在5-10分钟前理解你的评论:)但现在就理解吧。谢谢你的回复。