Estoy ejecutando varias consultas SQL de larga ejecución como parte de un módulo de informes. Estas consultas se construyen dinámicamente en tiempo de ejecución. Dependiendo de la entrada del usuario, pueden ser de declaración única o múltiple, tener uno o más parámetros y operar en una o más tablas de base de datos; en otras palabras, su formulario no puede anticiparse fácilmente.Utilice SqlTransaction & IsolationLevel para una operación de lectura prolongada?
Actualmente, sólo estoy ejecutar estas declaraciones en una ordinaria SqlConnection
, es decir
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
Debido a que estas consultas (realmente consultar lotes) puede tomar un tiempo para ejecutar, me preocupa acerca de los bloqueos en las tablas sosteniendo lee/escribe para otros usuarios. No es un problema si los datos de estos informes cambian durante la ejecución del lote; las consultas de informes nunca deben tener prioridad sobre otras operaciones en esas tablas, ni deben bloquearlas.
Para la mayoría de las operaciones de larga ejecución/declaraciones múltiples que implican modificar datos, usaría transacciones. La diferencia aquí es que estas consultas de informes no modifican ningún dato. ¿Sería correcto incluir estas consultas de informe en un SqlTransaction
para controlar su nivel de aislamiento?
es decir:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
Sería esto lograr mi resultado deseado? ¿Es correcto realizar una transacción, aunque no se hayan modificado los datos? ¿Hay otro enfoque?
¿Los informes tienen que ser [correcta] (http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might- be-missed-if-nolock-hint-is-used.aspx) o no? –
@RemusRusanu Los informes proporcionan una instantánea instantánea de los datos durante un largo período de tiempo; no es necesario que tengan en cuenta los cambios que pueden ocurrir a mitad de la transacción. Es probable que el usuario ejecute varias veces las consultas subyacentes en una sucesión breve, y el usuario no esperará que los resultados sean idénticos cada vez. –
Este es exactamente el tipo de informes que se ven afectados (mal) por lecturas sucias. Los recuentos y agregados saltarán aleatoriamente hacia arriba y hacia abajo y los datos dentro de una sola ejecución (un informe) no serán consistentes (p. Ej., Suma de adeudo! = Suma de crédito). Sus usuarios perderán confianza en el informe, ya que parecerá producir datos aleatorios. ¿Ha considerado en su lugar ['SNAPSHOT'] (http://msdn.microsoft.com/en-us/library/ms345124 (v = sql.90) .aspx)? –