Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql事务-Sql Server或C#?_C#_Sql Server_Transactions - Fatal编程技术网

Sql事务-Sql Server或C#?

Sql事务-Sql Server或C#?,c#,sql-server,transactions,C#,Sql Server,Transactions,从性能角度看,存储过程中的sql事务比代码好得多,我说的对吗 目前,我在存储过程中使用了大部分事务,但有时我会将代码用于更复杂的例程——显然,我会尽可能地将代码保持在最低限度 只是有一个复杂的例程需要太多的“变量”,用c#编写sql事务比使用sql Server容易得多。这是代码可读性和性能之间的一条细线 有什么想法吗?代码中的事务管理(读c#)是管理多个数据源或系统上的事务的一个选项。对于管理单个数据库的事务,服务器端的管理总是更简单。但是,如果您认为代码可能需要满足在事务中添加多个数据源的场

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

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

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


有什么想法吗?

代码中的事务管理(读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
-SQL
BEGIN 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分钟前理解你的评论:)但现在就理解吧。谢谢你的回复。