mickhansen / graphql-sequelize

GraphQL & Relay for MySQL & Postgres via Sequelize
MIT License
1.9k stars 172 forks source link

set a global transaction #608

Closed j-colter closed 6 years ago

j-colter commented 6 years ago
setName: {
  name: 'setName',
  description: 'set the name',
  inputFields: {...},
  outputFields: {...},
  mutateAndGetPayload: async (args, context, info) => {
    return context.models.sequelize.transaction(async () => {
      const {id, username} = args
      const { User, Task } = models
      let user = await User.findById(fromGlobalId(id).id)
      if (user) {
        await user.update({username})
      }

      const task = await Task.findById(1)
      await task.update({title: username})
      // if (id) throw new Error('error ....')

      return {
        changedUser: user
      }
    })
  }
}

here in a resolver, maybe several operations in a transaction, aimed to rollback if errors happed like "// if (id) throw new Error('error ....')", but in the log shows

Executing (bff36b7d-c916-45fb-8fbe-72f1dbe0a2e5): START TRANSACTION;
Executing (bff36b7d-c916-45fb-8fbe-72f1dbe0a2e5): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Executing (bff36b7d-c916-45fb-8fbe-72f1dbe0a2e5): SELECT `id`, `username`, `phone_number` AS `phoneNumber`, `email`, `password`, `gender`, `created_at`, `updated_at` FROM `base_user` AS `User` WHERE `User`.`id` = '3';
Executing (default): UPDATE `base_user` SET `username`='aassdd123',`updated_at`='2018-06-05 13:05:41' WHERE `id` = 3
Executing (default): SELECT `id`, `title`, `created_at`, `updated_at` FROM `base_task` AS `Task` WHERE `Task`.`id` = 1;
Executing (default): UPDATE `base_task` SET `title`='aassdd123',`updated_at`='2018-06-05 13:05:41' WHERE `id` = 1
Executing (bff36b7d-c916-45fb-8fbe-72f1dbe0a2e5): COMMIT;

it seems the operations didn't share the save transction, I had used the cls yet.