Skip to content

concurrent transaction throw deadlock error #1905

@wangsenyan

Description

@wangsenyan

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions