2010-12-07 14 views
7

¿Tengo razón al decir que desde una perspectiva de rendimiento, las transacciones sql son mucho mejores dentro de un procedimiento almacenado que el código?transacción Sql - SQL Server o C#?

Por el momento, utilizo la mayoría de mis transacciones en procs almacenados, pero a veces utilizo el código para rutinas más complejas, lo que obviamente mantengo al mínimo tanto como sea posible.

Es solo que había una rutina compleja que requería demasiadas "variables" que escribir la transacción sql en C# era mucho más fácil que usar SQL Server. Es una línea fina entre la legibilidad del código y el rendimiento.

¿Alguna idea?

+1

vea también: http://stackoverflow.com/questions/224689/transactions-in-net –

+0

Como un aparte: es la tienda * d * procedimientos - como * almacenado * en SQL Server - no almacena el procedimiento - solo un nitpick .... –

+0

Oh sí. Úselo para abreviar "store proc", gracias marc_s. – Rob

Respuesta

7

El rendimiento varía; un SqlTransaction puede tener menos sobrecarga que un TransactionScope, especialmente si el TransactionScope decide que necesita enredarse con el DTC. Pero no esperaría una gran diferencia entre SqlTransaction y BEGIN TRAN, excepto por el viaje redondo adicional. Sin embargo, TransactionScope sigue siendo rápido, y es la opción más conveniente para encapsular operaciones múltiples en una transacción, ya que la transacción ambiental no necesita asociarse manualmente con el comando cada vez.

Quizás un factor mejor (y más significativo) es el isolation-level. TransactionScope se predetermina a la más alta (serializable). Los niveles de aislamiento más bajos permiten más o menos bloqueos (pero a riesgo de lecturas no repetibles, etc.). IIRC una transacción TSQL está predeterminada en uno de los niveles inferiores. Pero el nivel de aislamiento puede ajustarse para las 3 opciones.

+0

Seré honesto y diré que casi siempre he usado transacciones en procs de la tienda y no muy a menudo en C# ado.net. Como tal, el TransactionScope es nuevo para mí y me alegra que hayas mencionado esto. Parece que necesito leer sobre esto. – Rob

1

La gestión de transacciones en el código (leer C#) es una opción que se debe seguir para gestionar transacciones en múltiples fuentes de datos o sistemas. Para gestionar la transacción de una única base de datos, la gestión en el extremo del servidor siempre será más simple. Pero si cree que el código podría necesitar un escenario donde se agreguen múltiples fuentes de datos en la transacción, mantenga las transacciones en el nivel del código.

+0

Buen punto sobre las múltiples bases de datos. La mayoría de las transacciones, si no todas, que uso son de hecho con una base de datos ... así que quizás estructurar todas las transacciones con el servidor sql. Gracias. – Rob

+0

Sí, en ese caso puede hacerlo al final del servidor. – Kangkan

1

Creo que el procedimiento de la tienda tendrá un mejor rendimiento.

+0

Pensé que sí. Gracias – Rob

1

Si quiere decir que escribe Transacciones SQL en C# y usa ADO.Net o similar para ejecutarlas, probablemente sean menos eficientes porque SQL almacenará en caché el plan de consulta para un procedimiento almacenado (que también es el caso de Entity Framework - aunque todavía no es tan rápido como proc, no creo) entonces realmente debería hacerlo al revés - procedimientos complejos en SQL para obtener los beneficios de almacenamiento en caché (si fuera así de simple ...)

+0

Sí Transacciones Sql en C# y usando ADO .NET. Olvidé el almacenamiento en caché. Gracias – Rob

+0

Habiendo dicho esto, ahora no estoy seguro de si no se almacenará en caché el plan de consulta para la consulta C#, hay algún truco para obtener el EF en la memoria caché (creo que tiene longitudes de columna fija o algo así) para que pueda aplicarse a las consultas de ADO.Net también; sin embargo, creo que esto solo se aplica en SQL 2008 – Rob

+0

Los planes de consulta se almacenan en caché y se vuelven a utilizar sin necesidad de procedimientos almacenados –

1

Depende de qué aplicación.

Pero diré que en la mayoría de los casos es mejor sorprenderse de tener lógica en la base de datos. Una ventaja de tener lógica de negocio en la base de datos, es que será igual incluso si tiene una versión WinForms y una web, o lo que sea

Pero si está hablando de CLR en SQL. Lo negativo con esto, se vuelve mucho más difícil para un DBA encontrar errores o algo por el estilo. actuación.

+0

Buen punto. Leí que CLR tiene un mejor rendimiento PERO, como dicen, encontrar errores es un problema importante. – Rob

2

Estoy a favor de TransactionScope. Según Marc, utilice un método de fábrica en su TransactionScope para soltar el nivel de aislamiento a READ COMMITTED para los usos más comunes que pueda imaginar.

Tenga en cuenta que se puede utilizar tanto las transacciones de SQL y TransactionScope - SQL BEGIN TRAN/COMMIT TRAN tendrá poco efecto sobre TransactionScope (aparte de incrementar/decrementar @@TRANCOUNT) - de esta manera si necesita llamar a la misma sproc SQL en otro lugar, por ejemplo, de una consulta adhoc que aún obtendrá el beneficio de una transacción.

El beneficio de TransactionScope IMO es que administrará el DTC si usted necesita hacer una confirmación de 2 fases (por ejemplo, varias bases de datos, colas u otras transacciones XA). Y con SQL 2005 y versiones posteriores, funciona con Lightweight Transaction Manager, por lo que no se requerirá DTC, p. si todos los accesos son para una base de datos, una conexión a la vez.

+0

Ahora que he leído más sobre TransactionScope y, de hecho, los niveles de aislamiento, estoy muy contento de haber planteado esta pregunta. No hubiera entendido sus comentarios 5-10 minutos antes :) pero ahora sí. Gracias por su respuesta. – Rob