Блокировка базы данных TypeORM: Пожалуйста, объясните, как использовать блокировку базы данных в TypeORM с помощью функции setLock()

#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<
    }
 

Пожалуйста, дайте мне знать, является ли этот подход правильным или предложите лучший способ, если таковой имеется.
Также подход к тестированию тоже не работает.

Спасибо!