Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

270
Vistas
Firebase: una transacción para 2 rutas en la base de datos en tiempo real

Tengo una base de datos con la siguiente estructura:

Estructura de mi base de datos

Ahora se pueden calificar dos pinturas entre sí y luego se actualiza la calificación. Pero puede suceder que una pintura se califique varias veces al mismo tiempo. Por lo tanto, intenté usar una transacción anidada (ver más abajo) para evitar condiciones de carrera:

 function pictureClicked(picture) { const db = getDatabase(); const leftRef = ref(db, '/paintings/' + generateDbName(currentLeft)); const rightRef = ref(db, '/paintings/' + generateDbName(currentRight)); const winnerLeft = (picture === 'left') ? 1 : 0; runTransaction(leftRef, (leftP) => { if (leftP) { runTransaction(rightRef, (rightP) => { if (rightP) { // Calculation of the new rating for each painting (Elo System) const tRatingLeft = Math.pow(10, leftP.rating / 400); const tRatingRight = Math.pow(10, rightP.rating / 400); const expectedLeft = tRatingLeft / (tRatingLeft + tRatingRight); const expectedRight = tRatingRight / (tRatingLeft + tRatingRight); // Setting new rating leftP.rating = leftP.rating + 32 * (winnerLeft - expectedLeft); rightP.rating = rightP.rating + 32 * ((1 - winnerLeft) - expectedRight); } return rightP; }); } return leftP; }); }

Ahora bien, esta solución realmente no funciona y he leído que no es el mejor enfoque para este problema. La única solución que encontré fue ejecutar una transacción en la raíz de mi base de datos, pero me temo que esto conduciría a un cuello de botella y muchas de las transacciones iniciadas ni siquiera escribirían en la base de datos, ya que las transacciones solo se reintentan 25 veces (o ¿Mi miedo aquí es infundado?). ¿Existen otras soluciones a este problema?

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Las transacciones de Firebase Realtime Database se ejecutan en una sola ruta en su base de datos. Actualmente no hay forma de ejecutar una transacción en múltiples rutas, por lo que el enfoque común es ejecutar la transacción en la ruta compartida de nivel más bajo ( /paintings en su caso).

De hecho, esto puede dar lugar a más conflictos, ya que hay más usuarios que realizan transacciones simultáneas.


La única alternativa que he usado a veces es construir mi propio mecanismo de transacción usando:

  1. Actualizaciones de rutas múltiples, para realizar ambas escrituras al mismo tiempo.
  2. Reglas de seguridad, para permitir solo la transición que tenga sentido en mi caso de uso.
  3. Reintentos del lado del cliente, de modo que la contención o los datos obsoletos aún se manejen correctamente.

Esto es bastante no trivial incluso para casos simples y puede requerir cambiar su estructura de datos y/o agregar valores adicionales a cada solicitud. Pero si supera esos obstáculos, le permitirá ejecutar una "transacción" a través de múltiples rutas.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda