Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

This adds a new strategy for paced mutations that enables parallel execution of mutations that affect different records, while still serializing mutations that share dependencies (based on globalKey).

Key features:

  • Mutations on different records run in parallel (no artificial serialization)
  • Mutations on the same record are serialized in order
  • Supports optional custom dependencies via getDependencies callback
  • Rollback cascade still works correctly across dependent mutations

This addresses the use case where users want maximum parallelism without sacrificing correctness - e.g., editing multiple independent items shouldn't block on each other, but edits to the same item must be ordered.

Example usage:

const mutate = usePacedMutations({
  onMutate: (vars) => collection.update(vars.id, ...),
  mutationFn: async ({ transaction }) => api.save(transaction.mutations),
  strategy: dependencyQueueStrategy()
})

// These run in parallel (different IDs):
mutate({ id: 1, title: 'A' })
mutate({ id: 2, title: 'B' })

// This waits for the first one (same ID):
mutate({ id: 1, title: 'C' })

🎯 Changes

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested this code locally with pnpm test:pr.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

This adds a new strategy for paced mutations that enables parallel execution
of mutations that affect different records, while still serializing mutations
that share dependencies (based on globalKey).

Key features:
- Mutations on different records run in parallel (no artificial serialization)
- Mutations on the same record are serialized in order
- Supports optional custom dependencies via getDependencies callback
- Rollback cascade still works correctly across dependent mutations

This addresses the use case where users want maximum parallelism without
sacrificing correctness - e.g., editing multiple independent items shouldn't
block on each other, but edits to the same item must be ordered.

Example usage:
```ts
const mutate = usePacedMutations({
  onMutate: (vars) => collection.update(vars.id, ...),
  mutationFn: async ({ transaction }) => api.save(transaction.mutations),
  strategy: dependencyQueueStrategy()
})

// These run in parallel (different IDs):
mutate({ id: 1, title: 'A' })
mutate({ id: 2, title: 'B' })

// This waits for the first one (same ID):
mutate({ id: 1, title: 'C' })
```
@changeset-bot
Copy link

changeset-bot bot commented Jan 5, 2026

🦋 Changeset detected

Latest commit: 4745e35

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 14 packages
Name Type
@tanstack/db Minor
@tanstack/angular-db Patch
@tanstack/electric-db-collection Patch
@tanstack/offline-transactions Patch
@tanstack/powersync-db-collection Patch
@tanstack/query-db-collection Patch
@tanstack/react-db Patch
@tanstack/rxdb-db-collection Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db Patch
todos Patch
@tanstack/db-example-paced-mutations-demo Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new
Copy link

pkg-pr-new bot commented Jan 5, 2026

More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1092

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1092

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1092

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1092

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1092

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1092

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1092

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1092

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1092

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1092

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1092

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1092

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1092

commit: 4745e35

@github-actions
Copy link
Contributor

github-actions bot commented Jan 5, 2026

Size Change: +778 B (+0.87%)

Total Size: 90.3 kB

Filename Size Change
./packages/db/dist/esm/index.js 2.7 kB +22 B (+0.82%)
./packages/db/dist/esm/paced-mutations.js 521 B +25 B (+5.04%) 🔍
./packages/db/dist/esm/strategies/dependencyQueueStrategy.js 731 B +731 B (new file) 🆕
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 999 B
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.24 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.46 kB
./packages/db/dist/esm/collection/subscription.js 3.62 kB
./packages/db/dist/esm/collection/sync.js 2.38 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.27 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.93 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.1 kB
./packages/db/dist/esm/optimistic-action.js 359 B
./packages/db/dist/esm/proxy.js 3.75 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 3.96 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.35 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.8 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.46 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.33 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.9 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 kB
./packages/db/dist/esm/SortedMap.js 1.3 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 247 B
./packages/db/dist/esm/strategies/queueStrategy.js 428 B
./packages/db/dist/esm/strategies/throttleStrategy.js 246 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 881 B
./packages/db/dist/esm/utils/browser-polyfills.js 304 B
./packages/db/dist/esm/utils/btree.js 5.61 kB
./packages/db/dist/esm/utils/comparison.js 852 B
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

compressed-size-action::db-package-size

@github-actions
Copy link
Contributor

github-actions bot commented Jan 5, 2026

Size Change: 0 B

Total Size: 3.35 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.12 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 431 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants