[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Task](https://evolu.dev/docs/api-reference/common/Task) › createMutexByKey

## Call Signature

```ts
function createMutexByKey<K>(
  options?: CreateMutexByKeyOptions<K, unknown>,
): MutexByKey<K>;
```

Defined in: [packages/common/src/Task.ts:6107](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L6107)

Creates a [MutexByKey](https://evolu.dev/docs/api-reference/common/Task/interfaces/MutexByKey).

### Example

```ts
import {
  assertOk,
  assertTrue,
  createMutexByKey,
  createRun,
  ok,
  type Task,
} from "@evolu/common";

const accountLocks = createMutexByKey<string>();
const balancesByAccount = new Map<string, number>();
const deposit = (account: string, amount: number): Task<number> =>
  accountLocks.withLock(account, () => {
    const balance = (balancesByAccount.get(account) ?? 0) + amount;
    balancesByAccount.set(account, balance);
    return ok(balance);
  });

await using run = createRun();
assertOk(await run(deposit("checking", 2)), 2);
assertOk(await run(deposit("checking", 3)), 5);
assertTrue(accountLocks.isIdle("checking"));
```

## Call Signature

```ts
function createMutexByKey<K, L>(
  options: CreateMutexByKeyOptions<K, L>,
): MutexByKey<K>;
```

Defined in: [packages/common/src/Task.ts:6112](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L6112)

Creates a [MutexByKey](https://evolu.dev/docs/api-reference/common/Task/interfaces/MutexByKey) with custom logical key lookup.