{
  "code": null,
  "collection": "architecture",
  "href": "https://banes-lab.com/ontology#architecture-unit-of-work-pattern",
  "id": "unit-of-work-pattern",
  "kind": "pattern",
  "layer": {
    "href": "https://banes-lab.com/ontology/schema#layer-atomic-boundary",
    "json": "https://banes-lab.com/json/records/layer/atomic-boundary",
    "label": "Atomic Boundary",
    "markdown": "https://banes-lab.com/records/layer/atomic-boundary.md",
    "ref": "layer:atomic-boundary"
  },
  "name": "Unit of Work Pattern",
  "ref": "architecture:unit-of-work-pattern",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-transaction-boundary",
          "json": "https://banes-lab.com/json/records/architecture/transaction-boundary",
          "label": "Transaction Boundary",
          "markdown": "https://banes-lab.com/records/architecture/transaction-boundary.md",
          "ref": "architecture:transaction-boundary"
        }
      ],
      "relation": "requires"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-atomicity",
          "json": "https://banes-lab.com/json/records/architecture/atomicity",
          "label": "Atomicity",
          "markdown": "https://banes-lab.com/records/architecture/atomicity.md",
          "ref": "architecture:atomicity"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-consistency",
          "json": "https://banes-lab.com/json/records/architecture/consistency",
          "label": "Consistency",
          "markdown": "https://banes-lab.com/records/architecture/consistency.md",
          "ref": "architecture:consistency"
        }
      ],
      "relation": "reinforces"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-coordinated-persistence",
          "json": "https://banes-lab.com/json/records/lexicon/coordinated-persistence",
          "label": "Coordinated Persistence",
          "markdown": "https://banes-lab.com/records/lexicon/coordinated-persistence.md",
          "ref": "lexicon:coordinated-persistence"
        }
      ],
      "relation": "enables"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-scattered-save-calls",
          "json": "https://banes-lab.com/json/records/lexicon/scattered-save-calls",
          "label": "Scattered Save Calls",
          "markdown": "https://banes-lab.com/records/lexicon/scattered-save-calls.md",
          "ref": "lexicon:scattered-save-calls"
        }
      ],
      "relation": "conflicts-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-repository-complexity",
          "json": "https://banes-lab.com/json/records/lexicon/repository-complexity",
          "label": "Repository Complexity",
          "markdown": "https://banes-lab.com/records/lexicon/repository-complexity.md",
          "ref": "lexicon:repository-complexity"
        }
      ],
      "relation": "tensions-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#tension-repository-complexity-unit-of-work-pattern",
          "json": "https://banes-lab.com/json/records/tension/repository-complexity-unit-of-work-pattern",
          "label": "Unit of Work Pattern / Repository Complexity",
          "markdown": "https://banes-lab.com/records/tension/repository-complexity-unit-of-work-pattern.md",
          "ref": "tension:repository-complexity-unit-of-work-pattern"
        }
      ],
      "relation": "tensions"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-scattered-save-calls",
          "json": "https://banes-lab.com/json/records/lexicon/scattered-save-calls",
          "label": "Scattered Save Calls",
          "markdown": "https://banes-lab.com/records/lexicon/scattered-save-calls.md",
          "ref": "lexicon:scattered-save-calls"
        }
      ],
      "relation": "violated-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#vocabulary-severity-recommended",
          "json": "https://banes-lab.com/json/records/vocabulary/severity-recommended",
          "label": "recommended",
          "markdown": "https://banes-lab.com/records/vocabulary/severity-recommended.md",
          "ref": "vocabulary:severity-recommended"
        }
      ],
      "relation": "severity"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-transactions-state-concurrency",
          "json": "https://banes-lab.com/json/records/architecture-category/transactions-state-concurrency",
          "label": "Transactions / State / Concurrency",
          "markdown": "https://banes-lab.com/records/architecture-category/transactions-state-concurrency.md",
          "ref": "architecture-category:transactions-state-concurrency"
        }
      ],
      "relation": "category"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/pag/guide#node-design",
          "json": "https://banes-lab.com/json/pag/guide/node-design",
          "label": "Node design",
          "markdown": "https://banes-lab.com/pag/guide/node-design.md",
          "ref": "chapter:/pag/guide#node-design"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-transactions-state-concurrency",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-transactions-state-concurrency",
          "label": "Transactions / State / Concurrency",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-transactions-state-concurrency.md",
          "ref": "chapter:/ontology#architecture-category-transactions-state-concurrency"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-transactions-state-concurrency",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-transactions-state-concurrency",
          "label": "Transactions / State / Concurrency",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-transactions-state-concurrency.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-transactions-state-concurrency"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-vocabulary-severity",
          "json": "https://banes-lab.com/json/ontology/schema/the-vocabulary-severity",
          "label": "Severity levels",
          "markdown": "https://banes-lab.com/ontology/schema/the-vocabulary-severity.md",
          "ref": "chapter:/ontology/schema#the-vocabulary-severity"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-resolutions",
          "json": "https://banes-lab.com/json/ontology/schema/the-resolutions",
          "label": "The resolutions",
          "markdown": "https://banes-lab.com/ontology/schema/the-resolutions.md",
          "ref": "chapter:/ontology/schema#the-resolutions"
        }
      ],
      "relation": "linked-from"
    }
  ],
  "summary": "A design pattern that collects the changes of one use case and commits them together in a single transaction.",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/ontology#architecture-consistency",
      "json": "https://banes-lab.com/json/records/architecture/consistency",
      "label": "Consistency",
      "markdown": "https://banes-lab.com/records/architecture/consistency.md",
      "ref": "architecture:consistency"
    },
    "previous": {
      "href": "https://banes-lab.com/ontology#architecture-transaction-boundary",
      "json": "https://banes-lab.com/json/records/architecture/transaction-boundary",
      "label": "Transaction Boundary",
      "markdown": "https://banes-lab.com/records/architecture/transaction-boundary.md",
      "ref": "architecture:transaction-boundary"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/records/architecture",
    "label": "Architecture principles",
    "markdown": "https://banes-lab.com/api/records/architecture.md",
    "ref": "api:records/architecture"
  },
  "aliases": [
    "Unit of Work"
  ],
  "exemplar": {
    "after": "const uow = unitOfWork.begin();\nuow.foos.save(foo);\nuow.bars.save(bar);\nuow.events.append(event);\nawait uow.commit();",
    "before": "await fooRepository.save(foo);\nawait barRepository.save(bar);\nawait eventRepository.save(event);",
    "lang": "ts",
    "medium": "code"
  },
  "formedBy": null,
  "scope": [
    "application service",
    "persistence"
  ],
  "severity": "recommended"
}
