diff --git a/src/find-options/FindOptionsUtils.ts b/src/find-options/FindOptionsUtils.ts index 50619b8f9ce..c678aa15368 100644 --- a/src/find-options/FindOptionsUtils.ts +++ b/src/find-options/FindOptionsUtils.ts @@ -160,7 +160,14 @@ export class FindOptionsUtils { if (options.lock) { if (options.lock.mode === "optimistic") { qb.setLock(options.lock.mode, options.lock.version); - } else if (options.lock.mode === "pessimistic_read" || options.lock.mode === "pessimistic_write" || options.lock.mode === "dirty_read" || options.lock.mode === "pessimistic_partial_write" || options.lock.mode === "pessimistic_write_or_fail") { + } else if ( + options.lock.mode === "pessimistic_read" || + options.lock.mode === "pessimistic_write" || + options.lock.mode === "dirty_read" || + options.lock.mode === "pessimistic_partial_write" || + options.lock.mode === "pessimistic_write_or_fail" || + options.lock.mode === "for_no_key_update" + ) { const tableNames = options.lock.tables ? options.lock.tables.map((table) => { const tableAlias = qb.expressionMap.aliases.find((alias) => { return alias.metadata.tableNameWithoutPrefix === table; diff --git a/test/functional/repository/find-options-locking/find-options-locking.ts b/test/functional/repository/find-options-locking/find-options-locking.ts index 4a2d2a36a19..42f7cf1bbd4 100644 --- a/test/functional/repository/find-options-locking/find-options-locking.ts +++ b/test/functional/repository/find-options-locking/find-options-locking.ts @@ -98,6 +98,27 @@ describe("repository > find options > locking", () => { }))); + it("should attach for no key update lock statement on query if locking enabled", () => Promise.all(connections.map(async connection => { + if (!(connection.driver instanceof PostgresDriver)) + return; + + const executedSql: string[] = []; + + await connection.manager.transaction(entityManager => { + const originalQuery = entityManager.queryRunner!.query.bind(entityManager.queryRunner); + entityManager.queryRunner!.query = (...args: any[]) => { + executedSql.push(args[0]); + return originalQuery(...args); + }; + + return entityManager + .getRepository(PostWithVersion) + .findOne(1, { lock: { mode: "for_no_key_update" } }); + }); + + expect(executedSql.join(" ").includes("FOR NO KEY UPDATE")).to.be.true; + }))); + it("should attach pessimistic write lock statement on query if locking enabled", () => Promise.all(connections.map(async connection => { if (connection.driver instanceof AbstractSqliteDriver || connection.driver instanceof CockroachDriver || connection.driver instanceof SapDriver) return;