🔒 Registro cerrado · Apertura oficial próximamente · Acceso exclusivo para alumnos activos
Iniciar SesiónTransacciones a medias y reversión
5 tareas · 40 min · Principiante
Una operación de varios pasos que falla a mitad deja el sistema en un estado que nadie diseñó: dinero cobrado sin pedido, existencias apartadas para nadie, filas bloqueadas que frenan a los demás. Droguería Siemprevida confirma cada pedido en una secuencia de pasos y aparta existencias para los domicilios en un trabajo en cola. Soporte recibe reclamos de clientes con un cobro y sin pedido. Te entrega el código, el registro de la aplicación, el reporte de la pasarela, la tabla de pedidos y el registro del motor de base de datos.
Objetivo de la sala
Una operación de varios pasos que falla a mitad deja el sistema en un estado que nadie diseñó: dinero cobrado sin pedido, existencias apartadas para nadie, filas bloqueadas que frenan a los demás. Droguería Siemprevida confirma cada pedido en una secuencia de pasos y aparta existencias para los domicilios en un trabajo en cola. Soporte recibe reclamos de clientes con un cobro y sin pedido. Te entrega el código, el registro de la aplicación, el reporte de la pasarela, la tabla de pedidos y el registro del motor de base de datos.Una transacción de base de datos agrupa varios cambios para que se apliquen todos o ninguno. Si algo falla antes de confirmarla, la reversión devuelve las tablas a como estaban. En Laravel, DB::transaction() hace las dos cosas sola: si el bloque termina, confirma; si una excepción sale del bloque, revierte y la vuelve a lanzar. Con DB::beginTransaction() el control es manual, y entonces cada camino de salida tiene que terminar en commit o en rollBack.
Lo que la reversión no alcanza es todo lo que ocurrió fuera de la base de datos aunque se haya escrito dentro del bloque: una llamada HTTP a una pasarela, un correo enviado, un archivo escrito, un mensaje publicado en una cola. Esos efectos ya salieron y no hay motor que los deshaga. El Top 10 de OWASP lo resume como regla de diseño: si una transacción de varios pasos falla a mitad, se revierte entera y se empieza de nuevo, porque intentar rescatar un estado parcial suele producir errores peores.
Responde para continuar
Dentro de una transacción se descuenta inventario y se cobra con una pasarela externa; luego algo falla y la transacción se revierte. ¿Qué queda deshecho?
Ver pista de ayuda
Pregúntate quién guarda el cobro: la base de datos de la tienda o la pasarela.
Abre el laboratorio y lee ConfirmarPedido.php con registro-aplicacion.txt al lado. El orden de los pasos importa: algunas fallas ocurren antes del cobro y no dejan rastro fuera de la base; otras ocurren después, cuando la pasarela ya aprobó. Busca en el registro las confirmaciones que llegaron a tener un cobro aprobado y aun así terminaron en reversión.
Responde para continuar
En las confirmaciones que llegaron a tener un cobro aprobado y aun así se revirtieron, ¿qué excepción interrumpió la transacción? Escribe su nombre tal como aparece en el registro.
Ver pista de ayuda
Descarta el rechazo del banco y la falla de inventario: ocurrieron antes de que hubiera cobro.
El alcance de este hallazgo se mide en pesos. Cruza reporte-pasarela.txt con pedidos-exportados.txt: un cobro aprobado cuyo pedido quedó pendiente y sin número de cobro es dinero que el cliente pagó por nada. Ten en cuenta que soporte ya anuló uno de esos cobros a mano tras un reclamo; ese ya no hay que devolverlo.
Responde para continuar
¿Cuántos pesos siguen cobrados a clientes por pedidos que quedaron sin cobro registrado, descontando lo que soporte ya anuló? Escribe solo el número, sin puntos.
Ver pista de ayuda
Cruza el número de cobro del reporte con la columna cobro_id de la exportación y revisa la columna de estado.
El otro reclamo del día fueron pedidos rechazados por «tiempo de espera de bloqueo» en un producto con existencias. Lee ReservarDomicilio.php y registro-motor.txt. Este código corre en un trabajador de colas, un proceso de larga vida que mantiene la misma conexión a la base entre un trabajo y el siguiente. Una transacción abierta a mano que sale por un camino sin commit ni rollBack sigue viva en esa conexión, con sus bloqueos, hasta que el proceso muere. El registro del motor muestra la sesión que quedó así y a quién hizo esperar.
Responde para continuar
¿Qué método puede salir sin confirmar ni revertir la transacción que abrió? Escribe su nombre tal como aparece en el código.
Ver pista de ayuda
Busca un return entre el inicio de la transacción y su confirmación.
La reserva tiene un arreglo directo: usar la forma con bloque, como ya hace liberarReserva, o revertir antes de cada salida. El cobro pide un rediseño, porque es el único paso que la base de datos no puede deshacer. Ese paso no debe quedar atrapado entre otros que pueden fallar después: el pedido se guarda primero como pendiente de pago, el cobro se hace con una llave única por pedido para que repetirlo no cobre dos veces, y lo que falle después, como la factura, deja el pedido pagado con un pendiente que se reintenta, no lo borra. Si alguna vez hay que deshacer un cobro, se hace con una anulación explícita que queda registrada.
Responde para continuar
¿Qué rediseño evita los cobros sin pedido de Siemprevida?
Ver pista de ayuda
El paso que no se puede deshacer no debe quedar en medio de pasos que pueden fallar.
Whoami-Labs Pro
Whoami-Labs Pro utiliza cookies
Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad
Preferencias
Configuraciones de cookies
Elige qué categorías permitir. Las esenciales siempre están activas. Consulta la Política de Privacidad.
Esenciales
Siempre activas · sesión, CSRF, tema y esta preferencia
Necesarias para iniciar sesión, proteger formularios (CSRF) y recordar tu elección de cookies y tema. Sin ellas la plataforma no funciona de forma segura.
Analíticos
Hoy no activos en la plataforma; listos para cuando se conecten
Nos ayudan a entender uso de cursos y páginas. Si los activas, se usarán cuando conectemos analítica; hasta entonces no se carga ningún tracker.
Marketing
Hoy no activos; campañas futuras solo con tu permiso
Comunicaciones o campañas. No activos hoy en la plataforma; quedarán listos si los conectamos y solo si los permites.