none
Acceso multiusuario RRS feed

  • Pregunta

  • Hola

    Uso VB.NET, LINQ y SQL Server 2012 en VS 2015

    Tengo este codigo para guardar un documento el cual se graba con un numero consecutivo.

    Contador() 
    Guardar()

    Esas rutinas se llaman desde el boton Guardar del formulario. La rutina Contador(), va al final de la tabla coge el ultimo numero, le suma uno y lo coloca en el textbox de siguiente numero.

    La Rutina Guardar() coge este numero en el texbox y lo graba en la tabla, impidiendo deplicarlo. Dentro de la Rutina Guardar() y al final, hay otro llamado a Contador().

    El problema esta cuando hay dos usarios on el mismo formulario en diferentes terminales y dan clic al mismo tiempo, uno de los dos no logra el consecutivo real y el programa pregunta que si va a reemplazar. Si se da que uno hace clic primero, no hay problemas.

    Alguna idea para resolver cuando den clic y lleguen al mismo tiempo?

    jueves, 9 de febrero de 2017 4:05

Respuestas

  • Encierra las dos llamadas en una transacción:

    Using t As New TransactionScope()
    
        Contador() 
        Guardar()
        t.Commit()
    
    End Using

    • Marcado como respuesta Formulaz5 martes, 11 de septiembre de 2018 12:26
    jueves, 9 de febrero de 2017 7:50
  • La "transacción" es una operación de base de datos, que desde el punto de vista del servidor SQL se inicia con una sentencia "Begin Transaction" y se cierra con "Commit" o con "Rollback". Cuando inicias una transacción y ejecutas varias sentencias SQL (tales como leer un valor, incrementarlo, volverlo a grabar), el servidor va poniendo bloqueos en los registros afectados, hasta que haces el Commit final y en ese momento quita los bloqueos. Si mientras tanto otro usuario entra justo a la vez a manipular esa información, el servidor no le responde al instante, sino que lo mantiene "a la espera" hasta que la primera transacción termina, y en ese momento ya le deja al segundo acceder a esa información. De esta manera no se corre el riesgo de que la información quede incorrectamente actualizada por manipularla dos usuarios simultaneamente.

    La instrucción que te puse con un TransactionScope (en System.Transactions si no me equivoco) es una de las formas en la que desde el código cliente en VB puedes hacer que se le envíen al servidor SQL las instrucciones Begin Transaction y Commit.

    • Propuesto como respuesta Willams Morales sábado, 11 de febrero de 2017 14:33
    • Marcado como respuesta Formulaz5 martes, 11 de septiembre de 2018 12:26
    viernes, 10 de febrero de 2017 7:20

Todas las respuestas

  • Encierra las dos llamadas en una transacción:

    Using t As New TransactionScope()
    
        Contador() 
        Guardar()
        t.Commit()
    
    End Using

    • Marcado como respuesta Formulaz5 martes, 11 de septiembre de 2018 12:26
    jueves, 9 de febrero de 2017 7:50
  • Hola Alberto.

    Gracias por tu tiempo.

    Sucede que nunca he usado transacciones. Entonces no sé qué estamos haciendo aquí con lo que me propones.

    Gracias otra vez.

    viernes, 10 de febrero de 2017 1:31
  • La "transacción" es una operación de base de datos, que desde el punto de vista del servidor SQL se inicia con una sentencia "Begin Transaction" y se cierra con "Commit" o con "Rollback". Cuando inicias una transacción y ejecutas varias sentencias SQL (tales como leer un valor, incrementarlo, volverlo a grabar), el servidor va poniendo bloqueos en los registros afectados, hasta que haces el Commit final y en ese momento quita los bloqueos. Si mientras tanto otro usuario entra justo a la vez a manipular esa información, el servidor no le responde al instante, sino que lo mantiene "a la espera" hasta que la primera transacción termina, y en ese momento ya le deja al segundo acceder a esa información. De esta manera no se corre el riesgo de que la información quede incorrectamente actualizada por manipularla dos usuarios simultaneamente.

    La instrucción que te puse con un TransactionScope (en System.Transactions si no me equivoco) es una de las formas en la que desde el código cliente en VB puedes hacer que se le envíen al servidor SQL las instrucciones Begin Transaction y Commit.

    • Propuesto como respuesta Willams Morales sábado, 11 de febrero de 2017 14:33
    • Marcado como respuesta Formulaz5 martes, 11 de septiembre de 2018 12:26
    viernes, 10 de febrero de 2017 7:20
  • Muchas gracias Alberto.

    Justo eso es lo que necesito. Y también me has edificado sobre esta realidad tan importante.

    Un abrazo.

    sábado, 11 de febrero de 2017 0:31