#node.js #typescript #postgresql #nestjs #typeorm
Вопрос:
Я хочу реализовать блокировку строк базы данных в PostgreSQL с помощью Nestjs и TypeORM. Не могли бы вы, пожалуйста, кто-нибудь сообщить мне, как это правильно реализовать. Я попытался использовать следующий код, но не уверен, блокирует ли он конкретную строку.
async testFun(): Promise<any> {
const user = await this.userRepo
.createQueryBuilder("user")
.useTransaction(true)
.setLock("pessimistic_write")
.where("id = :id", { id: 2 })
.getOne()
const updateResult: any = await this.userRepo.createQueryBuilder('test')
.update()
.set({ fullname: "frm3000" })
.where("id = :id", { id: 2 })
.execute();
return updateResu<
}
Запрос, сгенерированный TypeORM, является,
query: START TRANSACTION
query: SELECT * FROM "users" "user" WHERE id = $1 FOR UPDATE -- PARAMETERS: [2]
query: COMMIT
query: UPDATE "users" SET "fullname" = $1 WHERE "id" = $2 -- PARAMETERS: ["from3000",2]
Здесь фиксация сделана перед обновлением запроса, поэтому сомневался, заблокирована строка или нет.
Также я хочу протестировать его на своем локальном хосте с двумя разными портами localhost:3000 и localhost:3001. Поэтому я добавил тот же контроллер и сервисный код в другое приложение с портом 3001 с задержкой,
async testFun(): Promise<any> {
const user = await this.userRepo
.createQueryBuilder("user")
.useTransaction(true)
.setLock("pessimistic_write")
.where("id = :id", { id: 2 })
.getOne()
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
await sleep(20000);
const updateResult: any = await this.userRepo.createQueryBuilder('test')
.update()
.set({ fullname: "frm3001" })
.where("id = :id", { id: 2 })
.execute();
return updateResu<
}
Пожалуйста, дайте мне знать, является ли этот подход правильным или предложите лучший способ, если таковой имеется.
Также подход к тестированию тоже не работает.
Спасибо!