Мы используем Sequelize с базой данных AWS Aurora Postgresql с базой данных для чтения и записи.Sequelize настроен на использование реплики чтения и записи баз данных.
У нас есть таблица users
и таблица follows
.Тип объекта User
имеет поля, которые являются подзапросами, например поле следующееCount для пользователя:
...
followingCount: {
type: new GraphQLNonNull(GraphQLInt),
resolve(user) {
return db.Follower.count({
where: { followerId: user.id, status: "Approved" }
});
}
},
Когда мы добавляем запись в таблицу follows
для пользователя, затем возвращаем этот пользовательский экземплярfollowingCount
не обновляется.Я на 99% уверен, что это потому, что он читает из базы данных реплики / чтения, которая не имеет данных.Я подтвердил это, отключив реплику и увидев, что проблема исчезла.
Я не решаюсь добавить опцию useMaster
в эти поля, так как это сводит на нет нашу стратегию параллелизма.
Здесьэто точный код, который я вызываю:
const followingUser = await db.User.findOne({
where: {
id
}
});
await db.Follower.create({
followerId: getCurrentUserId(context),
followingId: id,
status: followingUser.privateProfile ? "Pending" : "Approved"
});
return followingUser.reload();
Поле followingCount
в пользовательском экземпляре (followingUser
) не возвращает самый новый счет, даже если он существует в базе данных master / write.
Какие есть варианты?Могу ли я каким-то образом обернуть свои мутации в блок, чтобы все, что выполняется внутри, использовало базу данных Master / Write?Обернул бы это в справку по транзакции, и если да, то как мне передать транзакцию моей
ЛЮБОЙ оцененной помощи
psql 9.6.8
sequelize 4.38.0