loopbackio / loopbackio/loopback-datasource-juggler

concurrent transaction throw deadlock error

Abierto
#1,905 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug needs grooming
Lenguaje dominante
JavaScript
Estrellas
282
Forks
366
Merge medio
17 h 4 min
PR fusionados (30 d)
10

Descripción

pm2 start server with two instance ,
two instance connect one mysql server.

1637033091(1)

  Component.queue = async (obj, appId, projectId, accessToken) => {
    const Project = Component.app.models.project;
    const Page = Component.app.models.page;
    const tx = await Project.beginTransaction({
      isolationLevel: Project.Transaction.REPEATABLE_READ
    });
    const options = { transaction: tx };
    try {
      const userId = accessToken.userId;
      const { pageId, data = [] } = obj;
      const project = await Project.findOne({
        where: { id: projectId, appId, ownerId: userId }
      }, options);
      const info = await Project.updateAll(
        { id: projectId },
        { lastUpdate: new Date() },
        options
      );

      let page = await Page.findById(pageId, options);
      let pages = await Page.find({
        where: { projectId }
      }, options)

      pages.forEach(page => {
        if (page.uuid)
          idMap[page.uuid] = page.id;
      })
      let components = await Component.find(
        {
          where: { projectId, pageId: page.id },
          fields: ["id", "uuid"]
        }, options
      )
      await Page.updateAll({ id: page.id }, { isNeedGenerate: true }, options);
      await tx.commit();
      return { success: true };
    } catch (err) {
      if (tx) {
        await tx.rollback();
      }
  };

i use Jmeter test it , with 50 threads / sec, then throw error
but threads number small for example less than 10, they work well,
mysql deallock

1637032830(1)

error

1637033134(1)

so,did i write the code ok ? thanks

it seem miss commit or rollback while concurrent

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el código de la transacción del issue y reproduce la carga de trabajo reportada usando dos instancias de pm2, MySQL y la concurrencia de JMeter indicada. Comprueba si la transacción se confirma o se revierte de forma consistente en cada ruta; el trabajo estará terminado cuando se identifique la causa del deadlock o se confirme que el código de la aplicación no es responsable.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, mysql
Área
backend, database
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.