Hola Calsadillo,
El concepto de encolado se utiliza para evitar que dos o más procesos intenten actualizar un registro de base de datos al mismo tiempo. Sin esto, dos procesos podrían seleccionar un registro, aplicar diferentes cambios y luego actualizar la base de datos uno tras otro. En este caso, las actualizaciones aplicadas por el primer proceso serían sobrescritas por las actualizaciones del segundo proceso.
Por lo tanto, mi primer comentario sería que no necesitas encolar ztable2 en absoluto si estás realizando un comando INSERT SQL.
El segundo comentario sería, ¿cuándo seleccionas los datos a actualizar para ztable1? Justo antes de esta selección, debes encolar los datos para ztable1. Esto significa que si otro proceso quiere acceder a estos datos para actualizarlos, su encolado fallará y no debería seleccionar los datos. Luego debes desencolar los datos para ztable1 después de haber realizado la actualización. (Puedes ver cómo SAP utiliza esta lógica al intentar cambiar una orden de venta en VA02 y luego, con otra sesión, intentar hacer lo mismo; te bloquearán).
Así que la secuencia sería más o menos la siguiente:
1. Encolar ztable1
2. Seleccionar los datos de ztable1 para actualizar
3. Actualizar el estado de ztable1
4. Insertar entrada en ztable2
5. Realizar commit work (lo que desencolará automáticamente ztable1)
6. Desencolar ztable1 (solo por exhaustividad)
Espero que esto ayude.
Brad