diff --git a/src/query-builder/QueryExpressionMap.ts b/src/query-builder/QueryExpressionMap.ts index c5fae2dca1..4d63ceff8f 100644 --- a/src/query-builder/QueryExpressionMap.ts +++ b/src/query-builder/QueryExpressionMap.ts @@ -147,6 +147,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 2a9ec07ff7..e8ac975ea2 100644 --- a/src/query-builder/SelectQueryBuilder.ts +++ b/src/query-builder/SelectQueryBuilder.ts @@ -990,6 +990,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. */ @@ -1612,6 +1622,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) {