¿Cómo puedo solucionar este problema MySQL / InnoDB supercondenación en un entorno no-bloqueo?

StackOverflow https://stackoverflow.com/questions/870097

  •  22-08-2019
  •  | 
  •  

Pregunta

Estamos utilizando MySQL con motor de almacenamiento InnoDB. Tenemos un ambiente "evented" que envía múltiples peticiones simultáneas sobre una mesa. Basicamente funciona de esta manera: Tenemos una función que hace que find_or_insert: - encontrar() -> en consecuencia, si está vacío -> Insertar -> resultado de find ()

Estamos utilizando un controlador de MySQL no bloqueo, lo que, básicamente, cuando comenzamos este pequeño algoritmo más de una vez al mismo tiempo, se corre todos los hallazgos antes de insertar el primer resultado ... etc.

Por desgracia, obtenemos estos errores: "Punto muerto se encontró cuando se trata de obtener el bloqueo; reinicie la transacción"

Cualquiera puede ayudar con eso?

[EDIT]: Además, yo realmente no entiendo por qué sería MySQL necesita para bloquear la mesa sólo para insertar un nuevo elemento aquí. Inicialmente aunque el incremento automático era el culpable aquí, así que lo quité ... bu todavía consigo el error. ¿Hay una manera de prevenir MySQL para bloquear la tabla de inserciones?

¿Fue útil?

Solución

MySQL manual de referencia para el diagnóstico y resolver. Parece que usted está haciendo una caché. Una razón probable podría ser que una gran cantidad de clientes al mismo tiempo golpeó la mesa tratando de crear la 'primera versión' (es decir golpear el 'caso del protector vacío'). Tal vez usted podría añadir un retardo pseudo-aleatorio o coordinar los creadores de modo que usted no recibe una gran cantidad de llamadas concurrentes crear con el PP?

EDIT: ¿Usted ha visto esta página ? Parece que es necesario establecer una configuración para desactivar las cerraduras para cada tabla con innodb my.cnf. Lo que principalmente estaba sugiriendo, sin embargo, fue que la prueba podría no ser representable, ya que puede contener un porcentaje mucho más alto escritores que en una situación realista. Si usted comienza a 100 hilos con una mesa vacía serían todos al instante bloquear en crear (incluso para el mismo valor tal vez). Esto es mucho peor que en una situación media donde se tiene una mejor distribución de las llaves, un menor número de fallos y un porcentaje mucho más alto de lecturas. Si este es el comportamiento esperado (es decir, que tendría este comportamiento en vivo), sugeriría la adición de una estrategia de retroceso en los estados crear.

Otros consejos

Es necesario estas solicitudes suceda uno a la vez, así que tal vez deje de usar ese conductor no bloqueante. O implementar su propio mecanismo de bloqueo. Esperar a que uno para terminar antes de pasar a la siguiente.

usted no ha dicho que esto no sea razonable, o que por alguna razón necesita estas cosas para moverse a lo largo tan rápidamente.

Estoy cambiando mi respuesta para reflejar que la cuestión se revisa. Ahora parece que esto es sólo un problema con las inserciones concurrentes, no una dependencia en el comportamiento de búsqueda.

Es mi entendimiento de que InnoDB fila de bloqueo en inserciones y no se puede desactivar esta opción. Sin embargo, usted [editar] no son capaces de usar INSERT DELAYED. Acabo de leer esto no está disponible en InnoDB.

http://dev.mysql.com/doc /refman/5.0/en/insert-delayed.html

Tal vez un explícitas LOCK TABLES alrededor de todas sus escrituras colectivamente tienen prioridad sobre el comportamiento de bloqueo por defecto. Si no hay otras operaciones sobre la mesa durante el intervalo cuando se producen los eventos de escritura, esto podría funcionar.

http://dev.mysql.com/doc /refman/5.0/en/lock-tables.html

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