diff --git a/src/query-builder/QueryExpressionMap.ts b/src/query-builder/QueryExpressionMap.ts index 2c86c82cbc..ae89d3c8f4 100644 --- a/src/query-builder/QueryExpressionMap.ts +++ b/src/query-builder/QueryExpressionMap.ts @@ -152,6 +152,12 @@ export class QueryExpressionMap { */ lockVersion?: number|Date; + /** + * Locking clause. + * + */ + lockClause?: string; + /** * Parameters used to be escaped in final query. */ diff --git a/src/query-builder/SelectQueryBuilder.ts b/src/query-builder/SelectQueryBuilder.ts index 78bd71bebb..14caf03cfb 100644 --- a/src/query-builder/SelectQueryBuilder.ts +++ b/src/query-builder/SelectQueryBuilder.ts @@ -999,6 +999,16 @@ export class SelectQueryBuilder extends QueryBuilder implements return this; } + /** + * Set a lock clause, passed directly into the query. + * e.g. `FOR UPDATE NOWAIT`. + * If set, will override `lockMode`. + */ + lock(clause: string): this { + this.expressionMap.lockClause = clause; + return this; + } + /** * Gets first raw result returned by execution of generated query builder sql. */ @@ -1634,6 +1644,11 @@ export class SelectQueryBuilder extends QueryBuilder implements */ protected createLockExpression(): string { const driver = this.connection.driver; + + if (this.expressionMap.lockClause) { + return ` ${this.expressionMap.lockClause}`; + } + switch (this.expressionMap.lockMode) { case "pessimistic_read": if (driver instanceof MysqlDriver || driver instanceof AuroraDataApiDriver) {