none
Ejecutar SP una sola Vez RRS feed

  • Pregunta

  • Estimados,

       Muy buenas tardes, favor su ayuda para lo siguiente, tengo un SP que debido a su criticidad requiero que no se pueda ejecutar mas de una vez al mismo tiempo, esto dado que con su resultado realizo ciertas operaciones que si se duplica su ejecución me descuadra todo el flujo y proceso diario.

       Hasta el momento, lo que habia pensado es poner una especie de bandera, es decir, actualizar una tabla en el inicio del procedimiento y volverla a cerrar cuando termine, con esto validar tambien en el inicio de este si tiene la marca de estar en ejecución, esto es la manera que se me ocurre, no se si SQL 2005 tiene alguna otra forma mas simple de realizar lo solicitado.

    muchas gracias por las ideas que me puedan dar.

    jueves, 21 de junio de 2018 21:06

Respuestas

  • Es configurable, depende del nivel de aislamento de la transacción. Si quieres que bloquee todo, le puedes poner un "set transaction isolation level Serializable", y si quiere que solo bloquee en escritura, pero no bloquee las lecturas, puedes dejar el valor de "set transaction isolation level read_committed".

    Editado: Si necesitas aumentar la concurrencia, considera también si te puede interesar alguno de los niveles de aislamiento por instantáneas.

    viernes, 22 de junio de 2018 6:42

Todas las respuestas

  • ¿Has pensado en ejecutarlo dentro de una transacción? La transacción va bloqueando todos los datos accedidos por el procedimiento, por lo que nadie más puede alterarlos simultaneamente, garantizando que no se te producen los mencionados "descuadres".
    jueves, 21 de junio de 2018 21:15
  • eso lo pense, pero mi duda es si la transaccion bloquea la tabla destino y la tabla origen, es decir, si cuando hago un Update desde otra tabla, bloquea los registros en la tabla donde se estan insertando, y tambien los de la consulta? si es así me sirve, en caso contrario no creo, ya que el ejecutar 2 veces el mismo sp al mismo momento solo bloqueará la tabla destino, pero cuando se desbloquee el proceso volverá a cargar el select en esta.

    jueves, 21 de junio de 2018 21:25
  • Es configurable, depende del nivel de aislamento de la transacción. Si quieres que bloquee todo, le puedes poner un "set transaction isolation level Serializable", y si quiere que solo bloquee en escritura, pero no bloquee las lecturas, puedes dejar el valor de "set transaction isolation level read_committed".

    Editado: Si necesitas aumentar la concurrencia, considera también si te puede interesar alguno de los niveles de aislamiento por instantáneas.

    viernes, 22 de junio de 2018 6:42
  • Aqui la solucion

    https://www.mssqltips.com/sqlservertip/3202/prevent-multiple-users-from-running-the-same-sql-server-stored-procedure-at-the-same-time/

    viernes, 22 de junio de 2018 16:41