Bloqueando los datos que se leen y cambian durante el envío
¿Parecería que esto es todo? Pero no lo es. Hay un punto muy importante que no hemos atendido.
Ahora el esquema de nuestro procedimiento es el siguiente:
- Ejecutamos la primera solicitud con el nombre . Como resultado, creamos una tabla temporal a partir de la lista de nomenclatura del documento.
Ejecutamos la segunda solicitud con el nombre Query2. Como resultado, leemos el coste y los saldos de la nomenclatura contenida en la sección tabular del documento.
Fijamos los movimientos de los registros (RegisterRecords.Write()).
Ejecutamos la tercera solicitud con el nombre Query3. Así comprobamos la presencia de saldos negativos.
Note que, a partir de la ejecución de la segunda solicitud y hasta el final del procedimiento, debemos asegurarnos de que el coste y los saldos de la nomenclatura con los que estamos trabajando permanezcan sin cambios y prohibir que otras transacciones incluso lean estos datos. El sistema, por supuesto, bloqueará los cambios en estos datos, pero sólo a partir del momento en que fijemos los movimientos.
Sin embargo, puede surgir la siguiente situación. Al ejecutar la segunda solicitud, leímos que había 2 unidades de un material. Y otra transacción (otro usuario) que va a cancelar los materiales también leyó que había 2 unidades de este material. Después de eso, hemos fijado los movimientos y el sistema ha bloqueado estos datos. Otra transacción está esperando que liberemos los datos. Hemos enviado el documento, hemos cancelado 2 unidades del material y hemos liberado los datos. Otra transacción también intenta cancelar 2 unidades del material, ¡pero ya no existen!
La misma situación puede surgir entre los puntos 3 y 4, por lo que el control de saldos no funcionará correctamente.
Por lo tanto, para evitar que se produzcan tales colisiones, hay que bloquear los saldos para que otras transacciones no puedan leerlos incluso antes de ejecutar la segunda solicitud. Es decir, antes de leer algo que vamos a cambiar, hay que prohibir que otras transacciones lean estos datos hasta que finalicemos nuestros cambios (o hasta que nos nieguemos a enviar el documento).