none
Duda sobre bloqueo RRS feed

  • Pregunta

  • uso el siguiente texto para un comando:

            'Dim TextoComando As String = _
            '"EXEC sp_getapplock 'Art', 'Exclusive' " & vbNewLine & _
            '"SELECT @idArt = MAX(idArt) + 1 FROM Art" & vbNewLine & _
            '"IF @idArt IS NULL SET @idArt = 1" & vbNewLine & _
            '"INSERT INTO Art(idArt, empre) VALUES (@idArt, @idempre)"
    la duda que tengo es si el bloqueo 'Exclusive' se realiza sobre la fila afectada o sobre toda la tabla.
    • Cambiado Enrique M. Montejo miércoles, 1 de junio de 2011 20:14 acceso a datos (De:Lenguaje VB.NET)
    sábado, 25 de julio de 2009 9:06

Todas las respuestas

  • hola,

    una consulta.

    has ejecutado ya ese comando tal como lo posteas ?

    o sea hasta donde se en un mismo string no se puede ejecutar ams de un comando a la vez, o sea o ejecutas el EXEc, o ejecutas el Select.

    creo que el tema de bloqueos lo deberias resolver por el tipo de transaccion que definas.

    TransactionScope

    Implementing TransactionScope Using .Net 2.0

    como sabras las transacciones generan bloqueos

    igualmente que mejor que ir a al fuente para saber como trabaja el comando sp_getapplock , segun veo hay otroa relacionados que te permiten testear el bloqueo.
    Aunque segun veo si es Exlusive seguro sea un bloqueo total sobre el recurso.


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 25 de julio de 2009 14:26
  • Si el comando funciona perfecto en un entorno transaccional, pero la duda que tengo es si bloquea toda la tabla o la fila afectada por el select.
    sábado, 25 de julio de 2009 17:31
  • hola,

    segun pude ver realiza un bloqueo en el recurso que le inducas a la instruccion.

    igualmente esto es facil de comprobar, corre el programa que realzias en modo debug ejecuta la linea del comando dejala alli
    luego ve al sql server e intenta editar el recurso o tabla que esta loqueando la aplicacion, intenta consultarla y agregar o modificar registos, asi verificaras si te lockeo tada la tabla o no.

    luego termina al aplicacion y realiza nuevamentedesde el ql server otra edicion para verificar que se libero el bloqueo

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 25 de julio de 2009 18:36
  • Pues bloquea toda la tabla, si paro la ejecucion en el commit desde sql server no puede abrir la tabla...vaya leña, porque hay otros valores para ese parametro como shared etc pero no se que hacen..y tampoco encuentro doc.
    domingo, 26 de julio de 2009 14:20
  • hola

    y no te animas a probar las otras opciones de la misma forma en que probaste con esta, la especificas y en modo debug detienes la ejecucion desde fuera en el sql server puedes manipular la tabla para verificar si te deja o no.

    otra consulta cual es la utilidad final de usar este SP de sql server ?
    si es por el menjo de transaciones el TransactioScope tambien bloquea.

    por ahi usar este otro objeto te resuleve el problema


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 26 de julio de 2009 14:37
  • He estado leyendo por ahi y parece que si el sp es para hacer un select puedes usar shared y dejar que si otro insert, update delete entra mientras haga su trabajo pero no se debe usar un insert por ejemplo con shared porque podria dar resultados raros, vamos que no tendria sentido pues no bloquearias nada en realidad.
    lo del bloqueo por fila o por tabla aun no lo tengo claro, parece que no bloquea la tabla ni la fila el bloqueo es sobre una tupla o tamaño de bytes proximo al registro, de manera que mientras se esta completando la transaccion no puedes abrir la tabla desde sql porque hay una serie de registros, los que correspondan a la tupla que estan bloqueados, pero si solo propusieras leer por ejemplo o modificar registros fuera de la tupla no debiera haber problema, no lo he probado pero es la consclusion a la que he llegado.
    Lo del transactionscope lo habia mirado pero tiene mucho peligro si el cliente no tiene un servicio iniciado, funciona o no segun la operacion, lo mas seguro que he encontrado es esto.
    domingo, 26 de julio de 2009 14:55