Pregunta

Tengo 35 funciones que se actualizan las tablas 1 a 3, en una transacción. Sin embargo, no solamente ejecuta las actualizaciones, pero lo hacen consultas también.

  • Tabla 1 hace actualización de fila sólo las acciones, y algunas consultas.
  • Cuadro 2 hace consultas y actualizaciones a nivel de fila filas existentes, ya veces elimina y agrega filas. Tabla 2 puede tener consultas dentro de la transacción antes y después de las eliminaciones de fila y o inserciones, y o actualizaciones.
  • Tabla 3 hace actualizaciones de filas sobre la base de los resultados de la Tabla 2 acciones anteriores.

Mi primera acción será la de asegurarse de que las actualizaciones tabla 3 se puede hacer todo al final.

La Tabla 1 es independiente de las otras 2 mesas, y probablemente puede ser primero o el último. Así Tabla 2 debe venir antes de la tabla 3 cambios.

Mi primera preocupación es que con la Tabla 2 acciones, hago consultas, a continuación, actualiza, entonces, más consultas, a continuación, a veces más actualizaciones. ¿Tengo que reorganización mi código no se debe hacer esto.

Mi segunda preocupación es que la tabla 3 es la mesa que con hilos de servlet tiene que ser rápido. Tabla 3 se utiliza para consultas simplemente por sí mismo. Pero parece que los bloqueos a nivel de fila no se detendrán las consultas.

Si tengo que, puedo poner el código de mantenimiento conjunto de mesa se ha descrito anteriormente en un único proceso en todo el clúster, de un hilo. La velocidad de las actualizaciones no importa. Sólo que las consultas en el cuadro 3 son rápidos. Y que nunca hay un punto muerto.

No sé diferencias entre Oracle y InnoDB, así que tengo preguntas allí. (Planeo actualizar a Oracle más tarde.)

Básicamente, estoy buscando para los punteros sobre lo que debe tener en cuenta. Por supuesto, podría obligar a un bloqueo de tabla completo en la tabla 2 y la tabla 3 a continuación, al comienzo de cada función de actualización, pero entonces mi consulta Tabla3 hilo servlet sufriría. Por lo que no parece ser una solución.

Además, yo estoy preocupado por solo con relación a la tabla 2 en sí, que algunas funciones de hacer consultas, actualizaciones basado en la consulta, nuevas consultas basadas en la actualización, y luego más actualizaciones, incluyendo fluye a través de los resultados a las actualizaciones de la tabla 3 . Esto parece muy desagradable.

Recomendaciones? Andy

No podría haber actualizaciones simultáneas en las mismas filas de 2 mesas, y he tenido cuidado de golpear las mesas con las actualizaciones en el mismo orden. Una de las tablas tiene 2 índices, y parece como que se necesita un bloqueo de tabla para actualizar el índice? Algunas de las funciones de consulta la tabla 1, actualización de la tabla 1, a continuación, opcionalmente consulta de tabla 2, a continuación, actualizar la tabla 2, en un bucle de repetición. Esta tabla contiene todas las relaciones del niño de los padres en un árbol de todos mis contenidos, por lo que es la actualización de gran volumen a través de todos los usuarios.

¿Fue útil?

Solución

En primer lugar, las consultas en Oracle (y creo que InnoDB) no tome una cerradura a menos que utilice para su actualización.

En segundo lugar, no hay nada idea de su escala de aplicación. ¿Cuántas transacciones concurrentes es lo que esperan tener? ¿Espera que sean actualizando las mismas filas?

El tipo de solicitud que pudiera sufrir de puntos muertos es un sistema de reservas o emisión de billetes (por ejemplo, personas que tratan de reservar los mismos asientos en un teatro), especialmente en situaciones de alta concurrencia (nuevo espectáculo se convierte en disponible para la reserva).

Si la aplicación se ajusta a este perfil, entonces es probable que quieren anticipar situaciones de punto muerto. Sin embargo, yo por lo menos considerar simplemente atrapando el error, de vuelta rodando y luego volver a intentar la operación. Si usted entra en más detalles en sus estructuras de tablas, relaciones y criterios de actualización, a continuación, un punto apropiado para el bloqueo puede hacerse evidente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top