2011-05-12 18 views
33

No utilizo los procedimientos almacenados muy a menudo y me preguntaba si tenía sentido ajustar mis consultas de selección en una transacción.¿Usar transacciones para declaraciones seleccionadas?

Mi procedimiento tiene tres consultas simples de selección, dos de las cuales usan el valor devuelto de la primera.

Respuesta

34

En una aplicación muy concurrente podría ocurrir (teóricamente) que los datos que ha leído en la primera selección se modifiquen antes de que se ejecuten las otras selecciones.

Si esa es una situación que podría ocurrir en su aplicación, debe utilizar una transacción para envolver sus selects. Sin embargo, asegúrese de elegir el isolation level correcto, no todos los tipos de transacción garantizan lecturas consistentes.

actualización: Usted también puede encontrar en las soluciones this article actualización/inserciones concurrentes (también conocido como upsert) interesante. Pone varios métodos comunes de upsert a la prueba para ver qué método realmente garantiza que datos no se modifican entre una instrucción de selección y la siguiente. Los resultados son, bueno, impactantes, diría yo.

+0

Utilicé un agente de servicio para un servicio simultáneo alto con un caso similar y tuve un problema de interbloqueo SQL bajo gran volumen. Al aplicar esta sugerencia y ** especialmente ** el referido [artículo] (http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/) arriba solucionado todos los puntos muertos - gracias :-) – Sia

2

Las transacciones se usan generalmente cuando tiene instrucciones de inserción, actualización o eliminación y desea tener el comportamiento atómico, es decir, cometer todo o no cometer nada. Sin embargo, puede usar la transacción para las declaraciones seleccionadas para asegurarse de que nadie más pueda actualizar la tabla de interés mientras se ejecutan las consultas seleccionadas.

Echa un vistazo a este msdn post.

+2

¿Has leído tu enlace? 'Una aplicación puede realizar acciones tales como la adquisición de bloqueos para proteger el nivel de aislamiento de transacciones de las sentencias SELECT '. Este es un buen caso de uso para eso, ya que el OP indicó que usa los resultados de una selección como parámetros en consultas posteriores. – JNK

Cuestiones relacionadas