@mytechtoday/augment-extensions 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/README.md +136 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/SCHEMA-VALIDATION-REPORT.md +216 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/brand-kit-example.yaml +292 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/campaign-brief-example.yaml +389 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/content-calendar-example.yaml +643 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/email-newsletter-example.md +376 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/landing-page-example.md +934 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/ppc-ad-copy-example.md +301 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/seo-blog-post-example.md +347 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/social-media-campaign-example.md +606 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/module.json +50 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/affiliate-influencer-marketing.md +593 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/asset-management.md +418 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/brand-consistency.md +210 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/content-marketing.md +337 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/conversion-optimization.md +455 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/direct-sales.md +499 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/email-marketing.md +439 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/legal-compliance.md +227 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/ppc-advertising.md +569 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/seo-optimization.md +470 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/social-media-marketing.md +414 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/universal-marketing.md +177 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/asset-inventory.schema.json +247 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/brand-kit.schema.json +326 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/campaign-brief.schema.json +342 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/color-palette.schema.json +223 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/content-template.schema.json +383 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -0
- package/augment-extensions/workflows/beads-integration/README.md +143 -0
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -0
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -0
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -0
- package/augment-extensions/workflows/beads-integration/module.json +75 -0
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -0
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -0
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -0
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/writing-standards/screenplay/README.md +300 -0
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -0
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -0
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -0
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -0
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -0
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -0
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -0
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -0
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -0
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -0
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -0
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -0
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -0
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -0
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -0
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -0
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -0
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -0
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -0
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -0
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -0
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -0
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -0
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -0
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -0
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -0
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -0
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -0
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -0
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -0
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -0
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -0
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -0
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -0
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -0
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -0
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -0
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -0
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -0
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -0
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -0
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +168 -10
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts +19 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +478 -63
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/types/gui.d.ts +62 -0
- package/cli/dist/types/gui.d.ts.map +1 -0
- package/cli/dist/types/gui.js +30 -0
- package/cli/dist/types/gui.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/gui-helpers.d.ts +23 -0
- package/cli/dist/utils/gui-helpers.d.ts.map +1 -0
- package/cli/dist/utils/gui-helpers.js +159 -0
- package/cli/dist/utils/gui-helpers.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +232 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +900 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +559 -105
- package/package.json +17 -6
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
# Relational Transactions
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers transaction management in relational databases, including ACID properties, transaction isolation levels, deadlock prevention, locking strategies, savepoints, and distributed transactions.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ACID Properties
|
|
10
|
+
|
|
11
|
+
### Atomicity
|
|
12
|
+
|
|
13
|
+
**Definition**: All operations in a transaction succeed or all fail (all-or-nothing)
|
|
14
|
+
|
|
15
|
+
**Example: Bank Transfer**
|
|
16
|
+
```sql
|
|
17
|
+
BEGIN TRANSACTION;
|
|
18
|
+
|
|
19
|
+
-- Deduct from account A
|
|
20
|
+
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
|
|
21
|
+
|
|
22
|
+
-- Add to account B
|
|
23
|
+
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
|
|
24
|
+
|
|
25
|
+
-- Both succeed or both fail
|
|
26
|
+
COMMIT;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**If any operation fails:**
|
|
30
|
+
```sql
|
|
31
|
+
BEGIN TRANSACTION;
|
|
32
|
+
|
|
33
|
+
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- Succeeds
|
|
34
|
+
UPDATE accounts SET balance = balance + 100 WHERE id = 999; -- Fails (account doesn't exist)
|
|
35
|
+
|
|
36
|
+
ROLLBACK; -- First update is rolled back
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Consistency
|
|
40
|
+
|
|
41
|
+
**Definition**: Database remains in a valid state before and after transaction
|
|
42
|
+
|
|
43
|
+
**Example: Constraints Ensure Consistency**
|
|
44
|
+
```sql
|
|
45
|
+
-- Add constraint
|
|
46
|
+
ALTER TABLE accounts ADD CONSTRAINT check_balance CHECK (balance >= 0);
|
|
47
|
+
|
|
48
|
+
-- This transaction will fail if it violates the constraint
|
|
49
|
+
BEGIN TRANSACTION;
|
|
50
|
+
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
|
|
51
|
+
COMMIT; -- Fails if balance would go negative
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Example: Referential Integrity**
|
|
55
|
+
```sql
|
|
56
|
+
-- Foreign key ensures consistency
|
|
57
|
+
CREATE TABLE orders (
|
|
58
|
+
id SERIAL PRIMARY KEY,
|
|
59
|
+
user_id INT NOT NULL REFERENCES users(id)
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
-- This will fail if user doesn't exist
|
|
63
|
+
INSERT INTO orders (user_id) VALUES (999); -- Error: foreign key violation
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Isolation
|
|
67
|
+
|
|
68
|
+
**Definition**: Concurrent transactions don't interfere with each other
|
|
69
|
+
|
|
70
|
+
**See "Transaction Isolation Levels" section for details**
|
|
71
|
+
|
|
72
|
+
### Durability
|
|
73
|
+
|
|
74
|
+
**Definition**: Committed transactions persist even after system failure
|
|
75
|
+
|
|
76
|
+
**Implementation:**
|
|
77
|
+
- Write-ahead logging (WAL)
|
|
78
|
+
- Transaction logs
|
|
79
|
+
- Checkpoints
|
|
80
|
+
- Replication
|
|
81
|
+
|
|
82
|
+
**Example:**
|
|
83
|
+
```sql
|
|
84
|
+
BEGIN TRANSACTION;
|
|
85
|
+
INSERT INTO orders (user_id, total) VALUES (1, 100.00);
|
|
86
|
+
COMMIT; -- Data is written to disk and persists even if system crashes
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Transaction Isolation Levels
|
|
92
|
+
|
|
93
|
+
### Overview
|
|
94
|
+
|
|
95
|
+
**Isolation levels** control how transactions interact with each other.
|
|
96
|
+
|
|
97
|
+
**Trade-off**: Higher isolation = more consistency, less concurrency
|
|
98
|
+
|
|
99
|
+
**Standard levels** (from least to most isolated):
|
|
100
|
+
1. Read Uncommitted
|
|
101
|
+
2. Read Committed (default in most databases)
|
|
102
|
+
3. Repeatable Read
|
|
103
|
+
4. Serializable
|
|
104
|
+
|
|
105
|
+
### Read Uncommitted
|
|
106
|
+
|
|
107
|
+
**Allows**: Dirty reads, non-repeatable reads, phantom reads
|
|
108
|
+
|
|
109
|
+
**Use case**: Rarely used (only when performance is critical and dirty reads are acceptable)
|
|
110
|
+
|
|
111
|
+
```sql
|
|
112
|
+
-- PostgreSQL (not supported, falls back to Read Committed)
|
|
113
|
+
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
114
|
+
|
|
115
|
+
-- MySQL
|
|
116
|
+
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Dirty Read Example:**
|
|
120
|
+
```sql
|
|
121
|
+
-- Transaction 1
|
|
122
|
+
BEGIN;
|
|
123
|
+
UPDATE accounts SET balance = 1000 WHERE id = 1;
|
|
124
|
+
-- Not committed yet
|
|
125
|
+
|
|
126
|
+
-- Transaction 2 (can see uncommitted changes)
|
|
127
|
+
BEGIN;
|
|
128
|
+
SELECT balance FROM accounts WHERE id = 1; -- Returns 1000 (dirty read)
|
|
129
|
+
COMMIT;
|
|
130
|
+
|
|
131
|
+
-- Transaction 1 rolls back
|
|
132
|
+
ROLLBACK; -- Balance is back to original value
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Read Committed
|
|
136
|
+
|
|
137
|
+
**Prevents**: Dirty reads
|
|
138
|
+
**Allows**: Non-repeatable reads, phantom reads
|
|
139
|
+
|
|
140
|
+
**Default in**: PostgreSQL, Oracle, SQL Server
|
|
141
|
+
|
|
142
|
+
```sql
|
|
143
|
+
-- PostgreSQL
|
|
144
|
+
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
145
|
+
|
|
146
|
+
-- MySQL
|
|
147
|
+
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Non-Repeatable Read Example:**
|
|
151
|
+
```sql
|
|
152
|
+
-- Transaction 1
|
|
153
|
+
BEGIN;
|
|
154
|
+
SELECT balance FROM accounts WHERE id = 1; -- Returns 500
|
|
155
|
+
|
|
156
|
+
-- Transaction 2 (commits a change)
|
|
157
|
+
BEGIN;
|
|
158
|
+
UPDATE accounts SET balance = 1000 WHERE id = 1;
|
|
159
|
+
COMMIT;
|
|
160
|
+
|
|
161
|
+
-- Transaction 1 (reads again, sees different value)
|
|
162
|
+
SELECT balance FROM accounts WHERE id = 1; -- Returns 1000 (non-repeatable read)
|
|
163
|
+
COMMIT;
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Repeatable Read
|
|
167
|
+
|
|
168
|
+
**Prevents**: Dirty reads, non-repeatable reads
|
|
169
|
+
**Allows**: Phantom reads
|
|
170
|
+
|
|
171
|
+
**Default in**: MySQL (InnoDB)
|
|
172
|
+
|
|
173
|
+
```sql
|
|
174
|
+
-- PostgreSQL
|
|
175
|
+
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
176
|
+
|
|
177
|
+
-- MySQL
|
|
178
|
+
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Phantom Read Example:**
|
|
182
|
+
```sql
|
|
183
|
+
-- Transaction 1
|
|
184
|
+
BEGIN;
|
|
185
|
+
SELECT COUNT(*) FROM orders WHERE user_id = 1; -- Returns 5
|
|
186
|
+
|
|
187
|
+
-- Transaction 2 (inserts a new row)
|
|
188
|
+
BEGIN;
|
|
189
|
+
INSERT INTO orders (user_id, total) VALUES (1, 100.00);
|
|
190
|
+
COMMIT;
|
|
191
|
+
|
|
192
|
+
-- Transaction 1 (counts again, may see different count)
|
|
193
|
+
SELECT COUNT(*) FROM orders WHERE user_id = 1; -- May return 6 (phantom read)
|
|
194
|
+
COMMIT;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Note**: PostgreSQL's Repeatable Read prevents phantom reads (behaves like Serializable for most cases)
|
|
198
|
+
|
|
199
|
+
### Serializable
|
|
200
|
+
|
|
201
|
+
**Prevents**: Dirty reads, non-repeatable reads, phantom reads
|
|
202
|
+
|
|
203
|
+
**Use case**: When absolute consistency is required
|
|
204
|
+
|
|
205
|
+
```sql
|
|
206
|
+
-- PostgreSQL
|
|
207
|
+
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
208
|
+
|
|
209
|
+
-- MySQL
|
|
210
|
+
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Trade-off**: Highest consistency, lowest concurrency (may cause serialization failures)
|
|
214
|
+
|
|
215
|
+
### Isolation Level Comparison
|
|
216
|
+
|
|
217
|
+
| Level | Dirty Read | Non-Repeatable Read | Phantom Read | Performance |
|
|
218
|
+
|-------|------------|---------------------|--------------|-------------|
|
|
219
|
+
| Read Uncommitted | ✅ Possible | ✅ Possible | ✅ Possible | Highest |
|
|
220
|
+
| Read Committed | ❌ Prevented | ✅ Possible | ✅ Possible | High |
|
|
221
|
+
| Repeatable Read | ❌ Prevented | ❌ Prevented | ✅ Possible* | Medium |
|
|
222
|
+
| Serializable | ❌ Prevented | ❌ Prevented | ❌ Prevented | Lowest |
|
|
223
|
+
|
|
224
|
+
*PostgreSQL's Repeatable Read prevents phantom reads
|
|
225
|
+
|
|
226
|
+
### Choosing Isolation Level
|
|
227
|
+
|
|
228
|
+
**Use Read Committed when:**
|
|
229
|
+
- ✅ Default for most applications
|
|
230
|
+
- ✅ Good balance of consistency and performance
|
|
231
|
+
- ✅ Dirty reads are unacceptable
|
|
232
|
+
- ✅ Non-repeatable reads are acceptable
|
|
233
|
+
|
|
234
|
+
**Use Repeatable Read when:**
|
|
235
|
+
- ✅ Consistent reads within transaction are required
|
|
236
|
+
- ✅ Reporting or analytics queries
|
|
237
|
+
- ✅ Batch processing
|
|
238
|
+
|
|
239
|
+
**Use Serializable when:**
|
|
240
|
+
- ✅ Absolute consistency is required
|
|
241
|
+
- ✅ Financial transactions
|
|
242
|
+
- ✅ Inventory management
|
|
243
|
+
- ✅ Low concurrency scenarios
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Locking Strategies
|
|
248
|
+
|
|
249
|
+
### Optimistic Locking
|
|
250
|
+
|
|
251
|
+
**Principle**: Assume conflicts are rare, check before committing
|
|
252
|
+
|
|
253
|
+
**Implementation**: Use version column or timestamp
|
|
254
|
+
|
|
255
|
+
```sql
|
|
256
|
+
-- Add version column
|
|
257
|
+
ALTER TABLE products ADD COLUMN version INT DEFAULT 0;
|
|
258
|
+
|
|
259
|
+
-- Read with version
|
|
260
|
+
SELECT id, name, price, version FROM products WHERE id = 1;
|
|
261
|
+
-- Returns: id=1, name='Widget', price=10.00, version=5
|
|
262
|
+
|
|
263
|
+
-- Update with version check
|
|
264
|
+
UPDATE products
|
|
265
|
+
SET price = 12.00, version = version + 1
|
|
266
|
+
WHERE id = 1 AND version = 5;
|
|
267
|
+
|
|
268
|
+
-- Check affected rows
|
|
269
|
+
-- If 0 rows affected, another transaction updated the record (conflict)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Application-level example:**
|
|
273
|
+
```javascript
|
|
274
|
+
// Read product
|
|
275
|
+
const product = await db.query('SELECT * FROM products WHERE id = ?', [1]);
|
|
276
|
+
|
|
277
|
+
// User modifies price
|
|
278
|
+
product.price = 12.00;
|
|
279
|
+
|
|
280
|
+
// Update with version check
|
|
281
|
+
const result = await db.query(
|
|
282
|
+
'UPDATE products SET price = ?, version = version + 1 WHERE id = ? AND version = ?',
|
|
283
|
+
[product.price, product.id, product.version]
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
if (result.affectedRows === 0) {
|
|
287
|
+
throw new Error('Product was modified by another user. Please refresh and try again.');
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Benefits:**
|
|
292
|
+
- ✅ Better performance (no locks held)
|
|
293
|
+
- ✅ Better scalability
|
|
294
|
+
- ✅ No deadlocks
|
|
295
|
+
|
|
296
|
+
**Drawbacks:**
|
|
297
|
+
- ❌ Conflicts must be handled by application
|
|
298
|
+
- ❌ Not suitable for high-conflict scenarios
|
|
299
|
+
|
|
300
|
+
### Pessimistic Locking
|
|
301
|
+
|
|
302
|
+
**Principle**: Lock rows before modifying to prevent conflicts
|
|
303
|
+
|
|
304
|
+
**Implementation**: Use SELECT FOR UPDATE
|
|
305
|
+
|
|
306
|
+
```sql
|
|
307
|
+
-- Lock row for update
|
|
308
|
+
BEGIN;
|
|
309
|
+
SELECT * FROM products WHERE id = 1 FOR UPDATE;
|
|
310
|
+
|
|
311
|
+
-- Other transactions will wait here
|
|
312
|
+
UPDATE products SET price = 12.00 WHERE id = 1;
|
|
313
|
+
|
|
314
|
+
COMMIT; -- Lock is released
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**Lock types:**
|
|
318
|
+
|
|
319
|
+
```sql
|
|
320
|
+
-- Exclusive lock (blocks all other locks)
|
|
321
|
+
SELECT * FROM products WHERE id = 1 FOR UPDATE;
|
|
322
|
+
|
|
323
|
+
-- Shared lock (blocks exclusive locks, allows other shared locks)
|
|
324
|
+
SELECT * FROM products WHERE id = 1 FOR SHARE; -- PostgreSQL
|
|
325
|
+
SELECT * FROM products WHERE id = 1 LOCK IN SHARE MODE; -- MySQL
|
|
326
|
+
|
|
327
|
+
-- Skip locked rows (don't wait)
|
|
328
|
+
SELECT * FROM products WHERE id = 1 FOR UPDATE SKIP LOCKED; -- PostgreSQL 9.5+
|
|
329
|
+
|
|
330
|
+
-- Fail immediately if locked
|
|
331
|
+
SELECT * FROM products WHERE id = 1 FOR UPDATE NOWAIT; -- PostgreSQL
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Benefits:**
|
|
335
|
+
- ✅ Prevents conflicts
|
|
336
|
+
- ✅ Simpler application logic
|
|
337
|
+
- ✅ Suitable for high-conflict scenarios
|
|
338
|
+
|
|
339
|
+
**Drawbacks:**
|
|
340
|
+
- ❌ Lower performance (locks held during transaction)
|
|
341
|
+
- ❌ Potential for deadlocks
|
|
342
|
+
- ❌ Reduced concurrency
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Deadlock Prevention
|
|
347
|
+
|
|
348
|
+
### What is a Deadlock?
|
|
349
|
+
|
|
350
|
+
**Definition**: Two or more transactions waiting for each other to release locks
|
|
351
|
+
|
|
352
|
+
**Example:**
|
|
353
|
+
```sql
|
|
354
|
+
-- Transaction 1
|
|
355
|
+
BEGIN;
|
|
356
|
+
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- Locks account 1
|
|
357
|
+
-- Waiting to lock account 2...
|
|
358
|
+
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
|
|
359
|
+
|
|
360
|
+
-- Transaction 2 (at the same time)
|
|
361
|
+
BEGIN;
|
|
362
|
+
UPDATE accounts SET balance = balance - 50 WHERE id = 2; -- Locks account 2
|
|
363
|
+
-- Waiting to lock account 1...
|
|
364
|
+
UPDATE accounts SET balance = balance + 50 WHERE id = 1;
|
|
365
|
+
|
|
366
|
+
-- DEADLOCK! Both transactions are waiting for each other
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Deadlock Prevention Strategies
|
|
370
|
+
|
|
371
|
+
#### 1. Lock Resources in Consistent Order
|
|
372
|
+
|
|
373
|
+
```sql
|
|
374
|
+
-- ❌ BAD: Inconsistent lock order
|
|
375
|
+
-- Transaction 1: Lock A, then B
|
|
376
|
+
-- Transaction 2: Lock B, then A
|
|
377
|
+
|
|
378
|
+
-- ✅ GOOD: Consistent lock order (always lock lower ID first)
|
|
379
|
+
BEGIN;
|
|
380
|
+
UPDATE accounts SET balance = balance - 100 WHERE id = LEAST(1, 2);
|
|
381
|
+
UPDATE accounts SET balance = balance + 100 WHERE id = GREATEST(1, 2);
|
|
382
|
+
COMMIT;
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
#### 2. Keep Transactions Short
|
|
386
|
+
|
|
387
|
+
```sql
|
|
388
|
+
-- ❌ BAD: Long transaction holding locks
|
|
389
|
+
BEGIN;
|
|
390
|
+
SELECT * FROM products WHERE id = 1 FOR UPDATE;
|
|
391
|
+
-- ... complex business logic ...
|
|
392
|
+
-- ... external API call ...
|
|
393
|
+
UPDATE products SET price = 12.00 WHERE id = 1;
|
|
394
|
+
COMMIT;
|
|
395
|
+
|
|
396
|
+
-- ✅ GOOD: Short transaction
|
|
397
|
+
-- Do business logic first
|
|
398
|
+
const newPrice = calculatePrice();
|
|
399
|
+
|
|
400
|
+
BEGIN;
|
|
401
|
+
SELECT * FROM products WHERE id = 1 FOR UPDATE;
|
|
402
|
+
UPDATE products SET price = newPrice WHERE id = 1;
|
|
403
|
+
COMMIT;
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
#### 3. Use Lower Isolation Levels
|
|
407
|
+
|
|
408
|
+
```sql
|
|
409
|
+
-- ✅ GOOD: Use Read Committed instead of Serializable when possible
|
|
410
|
+
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
#### 4. Use Timeouts
|
|
414
|
+
|
|
415
|
+
```sql
|
|
416
|
+
-- PostgreSQL: Set lock timeout
|
|
417
|
+
SET lock_timeout = '5s';
|
|
418
|
+
|
|
419
|
+
-- MySQL: Set lock wait timeout
|
|
420
|
+
SET innodb_lock_wait_timeout = 5;
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Handling Deadlocks
|
|
424
|
+
|
|
425
|
+
**Database automatically detects and resolves deadlocks by rolling back one transaction**
|
|
426
|
+
|
|
427
|
+
```javascript
|
|
428
|
+
// Application should retry on deadlock
|
|
429
|
+
async function transferMoney(fromId, toId, amount, maxRetries = 3) {
|
|
430
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
431
|
+
try {
|
|
432
|
+
await db.transaction(async (tx) => {
|
|
433
|
+
await tx.query('UPDATE accounts SET balance = balance - ? WHERE id = ?', [amount, fromId]);
|
|
434
|
+
await tx.query('UPDATE accounts SET balance = balance + ? WHERE id = ?', [amount, toId]);
|
|
435
|
+
});
|
|
436
|
+
return; // Success
|
|
437
|
+
} catch (error) {
|
|
438
|
+
if (error.code === 'DEADLOCK' && i < maxRetries - 1) {
|
|
439
|
+
// Wait and retry
|
|
440
|
+
await sleep(Math.random() * 100);
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
throw error;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
## Savepoints
|
|
452
|
+
|
|
453
|
+
### What are Savepoints?
|
|
454
|
+
|
|
455
|
+
**Definition**: Markers within a transaction that allow partial rollback
|
|
456
|
+
|
|
457
|
+
**Use case**: Complex transactions with multiple steps where you want to rollback only part of the transaction
|
|
458
|
+
|
|
459
|
+
### Using Savepoints
|
|
460
|
+
|
|
461
|
+
```sql
|
|
462
|
+
-- PostgreSQL / MySQL
|
|
463
|
+
BEGIN;
|
|
464
|
+
|
|
465
|
+
INSERT INTO orders (user_id, total) VALUES (1, 100.00);
|
|
466
|
+
|
|
467
|
+
SAVEPOINT after_order;
|
|
468
|
+
|
|
469
|
+
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 10, 2);
|
|
470
|
+
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 20, 1);
|
|
471
|
+
|
|
472
|
+
-- Error occurs
|
|
473
|
+
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 999, 1); -- Product doesn't exist
|
|
474
|
+
|
|
475
|
+
-- Rollback to savepoint (keeps order, removes order_items)
|
|
476
|
+
ROLLBACK TO SAVEPOINT after_order;
|
|
477
|
+
|
|
478
|
+
-- Continue transaction
|
|
479
|
+
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 30, 1);
|
|
480
|
+
|
|
481
|
+
COMMIT;
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Nested Savepoints
|
|
485
|
+
|
|
486
|
+
```sql
|
|
487
|
+
BEGIN;
|
|
488
|
+
|
|
489
|
+
INSERT INTO users (email) VALUES ('user@example.com');
|
|
490
|
+
SAVEPOINT user_created;
|
|
491
|
+
|
|
492
|
+
INSERT INTO profiles (user_id, name) VALUES (1, 'John');
|
|
493
|
+
SAVEPOINT profile_created;
|
|
494
|
+
|
|
495
|
+
INSERT INTO addresses (user_id, street) VALUES (1, '123 Main St');
|
|
496
|
+
SAVEPOINT address_created;
|
|
497
|
+
|
|
498
|
+
-- Rollback to specific savepoint
|
|
499
|
+
ROLLBACK TO SAVEPOINT profile_created; -- Removes addresses and profiles, keeps user
|
|
500
|
+
|
|
501
|
+
COMMIT;
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### Application-Level Example
|
|
505
|
+
|
|
506
|
+
```javascript
|
|
507
|
+
async function createOrderWithItems(userId, items) {
|
|
508
|
+
const client = await pool.connect();
|
|
509
|
+
|
|
510
|
+
try {
|
|
511
|
+
await client.query('BEGIN');
|
|
512
|
+
|
|
513
|
+
// Create order
|
|
514
|
+
const orderResult = await client.query(
|
|
515
|
+
'INSERT INTO orders (user_id, total) VALUES ($1, $2) RETURNING id',
|
|
516
|
+
[userId, 0]
|
|
517
|
+
);
|
|
518
|
+
const orderId = orderResult.rows[0].id;
|
|
519
|
+
|
|
520
|
+
await client.query('SAVEPOINT after_order');
|
|
521
|
+
|
|
522
|
+
let total = 0;
|
|
523
|
+
|
|
524
|
+
// Add items
|
|
525
|
+
for (const item of items) {
|
|
526
|
+
try {
|
|
527
|
+
await client.query(
|
|
528
|
+
'INSERT INTO order_items (order_id, product_id, quantity, price) VALUES ($1, $2, $3, $4)',
|
|
529
|
+
[orderId, item.productId, item.quantity, item.price]
|
|
530
|
+
);
|
|
531
|
+
total += item.price * item.quantity;
|
|
532
|
+
} catch (error) {
|
|
533
|
+
// Rollback to savepoint and continue with other items
|
|
534
|
+
await client.query('ROLLBACK TO SAVEPOINT after_order');
|
|
535
|
+
console.error(`Failed to add item ${item.productId}:`, error);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// Update order total
|
|
540
|
+
await client.query('UPDATE orders SET total = $1 WHERE id = $2', [total, orderId]);
|
|
541
|
+
|
|
542
|
+
await client.query('COMMIT');
|
|
543
|
+
return orderId;
|
|
544
|
+
} catch (error) {
|
|
545
|
+
await client.query('ROLLBACK');
|
|
546
|
+
throw error;
|
|
547
|
+
} finally {
|
|
548
|
+
client.release();
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## Two-Phase Commit (2PC)
|
|
556
|
+
|
|
557
|
+
### What is Two-Phase Commit?
|
|
558
|
+
|
|
559
|
+
**Definition**: Protocol for coordinating distributed transactions across multiple databases
|
|
560
|
+
|
|
561
|
+
**Phases:**
|
|
562
|
+
1. **Prepare phase**: All participants prepare to commit and vote yes/no
|
|
563
|
+
2. **Commit phase**: If all vote yes, coordinator tells all to commit; otherwise, all rollback
|
|
564
|
+
|
|
565
|
+
### Two-Phase Commit Example
|
|
566
|
+
|
|
567
|
+
```sql
|
|
568
|
+
-- Coordinator
|
|
569
|
+
BEGIN;
|
|
570
|
+
|
|
571
|
+
-- Prepare phase
|
|
572
|
+
PREPARE TRANSACTION 'tx_123' ON database1;
|
|
573
|
+
PREPARE TRANSACTION 'tx_123' ON database2;
|
|
574
|
+
|
|
575
|
+
-- All participants voted yes
|
|
576
|
+
-- Commit phase
|
|
577
|
+
COMMIT PREPARED 'tx_123' ON database1;
|
|
578
|
+
COMMIT PREPARED 'tx_123' ON database2;
|
|
579
|
+
|
|
580
|
+
-- If any participant voted no
|
|
581
|
+
-- ROLLBACK PREPARED 'tx_123' ON database1;
|
|
582
|
+
-- ROLLBACK PREPARED 'tx_123' ON database2;
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Limitations
|
|
586
|
+
|
|
587
|
+
**Drawbacks:**
|
|
588
|
+
- ❌ Blocking protocol (participants wait for coordinator)
|
|
589
|
+
- ❌ Single point of failure (coordinator)
|
|
590
|
+
- ❌ Performance overhead
|
|
591
|
+
- ❌ Not supported by all databases
|
|
592
|
+
|
|
593
|
+
**Alternatives:**
|
|
594
|
+
- ✅ Saga pattern (compensating transactions)
|
|
595
|
+
- ✅ Event sourcing
|
|
596
|
+
- ✅ Eventual consistency
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
## Distributed Transactions
|
|
601
|
+
|
|
602
|
+
### Saga Pattern
|
|
603
|
+
|
|
604
|
+
**Principle**: Break distributed transaction into local transactions with compensating actions
|
|
605
|
+
|
|
606
|
+
**Example: Order Processing**
|
|
607
|
+
|
|
608
|
+
```javascript
|
|
609
|
+
// Saga: Create order, reserve inventory, charge payment
|
|
610
|
+
async function createOrderSaga(userId, items, paymentInfo) {
|
|
611
|
+
const compensations = [];
|
|
612
|
+
|
|
613
|
+
try {
|
|
614
|
+
// Step 1: Create order
|
|
615
|
+
const order = await createOrder(userId, items);
|
|
616
|
+
compensations.push(() => cancelOrder(order.id));
|
|
617
|
+
|
|
618
|
+
// Step 2: Reserve inventory
|
|
619
|
+
await reserveInventory(items);
|
|
620
|
+
compensations.push(() => releaseInventory(items));
|
|
621
|
+
|
|
622
|
+
// Step 3: Charge payment
|
|
623
|
+
await chargePayment(paymentInfo, order.total);
|
|
624
|
+
compensations.push(() => refundPayment(paymentInfo, order.total));
|
|
625
|
+
|
|
626
|
+
// All steps succeeded
|
|
627
|
+
return order;
|
|
628
|
+
} catch (error) {
|
|
629
|
+
// Execute compensations in reverse order
|
|
630
|
+
for (const compensate of compensations.reverse()) {
|
|
631
|
+
try {
|
|
632
|
+
await compensate();
|
|
633
|
+
} catch (compensationError) {
|
|
634
|
+
console.error('Compensation failed:', compensationError);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
throw error;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
### Event Sourcing
|
|
643
|
+
|
|
644
|
+
**Principle**: Store events instead of current state, rebuild state from events
|
|
645
|
+
|
|
646
|
+
```javascript
|
|
647
|
+
// Event sourcing example
|
|
648
|
+
const events = [
|
|
649
|
+
{ type: 'OrderCreated', orderId: 1, userId: 1, total: 100 },
|
|
650
|
+
{ type: 'ItemAdded', orderId: 1, productId: 10, quantity: 2 },
|
|
651
|
+
{ type: 'ItemAdded', orderId: 1, productId: 20, quantity: 1 },
|
|
652
|
+
{ type: 'PaymentCharged', orderId: 1, amount: 100 },
|
|
653
|
+
{ type: 'OrderShipped', orderId: 1, trackingNumber: 'ABC123' }
|
|
654
|
+
];
|
|
655
|
+
|
|
656
|
+
// Rebuild state from events
|
|
657
|
+
function rebuildOrderState(events) {
|
|
658
|
+
const state = { items: [], payments: [], shipments: [] };
|
|
659
|
+
|
|
660
|
+
for (const event of events) {
|
|
661
|
+
switch (event.type) {
|
|
662
|
+
case 'OrderCreated':
|
|
663
|
+
state.id = event.orderId;
|
|
664
|
+
state.userId = event.userId;
|
|
665
|
+
state.total = event.total;
|
|
666
|
+
break;
|
|
667
|
+
case 'ItemAdded':
|
|
668
|
+
state.items.push({ productId: event.productId, quantity: event.quantity });
|
|
669
|
+
break;
|
|
670
|
+
case 'PaymentCharged':
|
|
671
|
+
state.payments.push({ amount: event.amount });
|
|
672
|
+
break;
|
|
673
|
+
case 'OrderShipped':
|
|
674
|
+
state.shipments.push({ trackingNumber: event.trackingNumber });
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return state;
|
|
680
|
+
}
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
---
|
|
684
|
+
|
|
685
|
+
## Transaction Best Practices
|
|
686
|
+
|
|
687
|
+
### DO
|
|
688
|
+
|
|
689
|
+
✅ Keep transactions as short as possible
|
|
690
|
+
✅ Use appropriate isolation level for your use case
|
|
691
|
+
✅ Handle deadlocks with retries
|
|
692
|
+
✅ Use optimistic locking for low-conflict scenarios
|
|
693
|
+
✅ Use pessimistic locking for high-conflict scenarios
|
|
694
|
+
✅ Lock resources in consistent order
|
|
695
|
+
✅ Use savepoints for complex transactions
|
|
696
|
+
✅ Set timeouts to prevent long-running transactions
|
|
697
|
+
✅ Monitor transaction performance
|
|
698
|
+
|
|
699
|
+
### DON'T
|
|
700
|
+
|
|
701
|
+
❌ Hold locks during external API calls
|
|
702
|
+
❌ Use Serializable isolation level unless necessary
|
|
703
|
+
❌ Ignore deadlock errors
|
|
704
|
+
❌ Use long-running transactions
|
|
705
|
+
❌ Mix business logic with database transactions
|
|
706
|
+
❌ Forget to commit or rollback transactions
|
|
707
|
+
❌ Use distributed transactions unless absolutely necessary
|
|
708
|
+
|
|
709
|
+
### Transaction Patterns
|
|
710
|
+
|
|
711
|
+
**Pattern 1: Unit of Work**
|
|
712
|
+
```javascript
|
|
713
|
+
class UnitOfWork {
|
|
714
|
+
constructor(db) {
|
|
715
|
+
this.db = db;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
async execute(work) {
|
|
719
|
+
const client = await this.db.connect();
|
|
720
|
+
try {
|
|
721
|
+
await client.query('BEGIN');
|
|
722
|
+
const result = await work(client);
|
|
723
|
+
await client.query('COMMIT');
|
|
724
|
+
return result;
|
|
725
|
+
} catch (error) {
|
|
726
|
+
await client.query('ROLLBACK');
|
|
727
|
+
throw error;
|
|
728
|
+
} finally {
|
|
729
|
+
client.release();
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
// Usage
|
|
735
|
+
const uow = new UnitOfWork(pool);
|
|
736
|
+
await uow.execute(async (client) => {
|
|
737
|
+
await client.query('INSERT INTO users (email) VALUES ($1)', ['user@example.com']);
|
|
738
|
+
await client.query('INSERT INTO profiles (user_id, name) VALUES ($1, $2)', [1, 'John']);
|
|
739
|
+
});
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
**Pattern 2: Repository with Transactions**
|
|
743
|
+
```javascript
|
|
744
|
+
class OrderRepository {
|
|
745
|
+
constructor(db) {
|
|
746
|
+
this.db = db;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
async createWithItems(userId, items) {
|
|
750
|
+
return this.db.transaction(async (tx) => {
|
|
751
|
+
const order = await tx.query(
|
|
752
|
+
'INSERT INTO orders (user_id, total) VALUES ($1, $2) RETURNING *',
|
|
753
|
+
[userId, 0]
|
|
754
|
+
);
|
|
755
|
+
|
|
756
|
+
let total = 0;
|
|
757
|
+
for (const item of items) {
|
|
758
|
+
await tx.query(
|
|
759
|
+
'INSERT INTO order_items (order_id, product_id, quantity, price) VALUES ($1, $2, $3, $4)',
|
|
760
|
+
[order.id, item.productId, item.quantity, item.price]
|
|
761
|
+
);
|
|
762
|
+
total += item.price * item.quantity;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
await tx.query('UPDATE orders SET total = $1 WHERE id = $2', [total, order.id]);
|
|
766
|
+
|
|
767
|
+
return order;
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
---
|
|
774
|
+
|
|
775
|
+
## Related Documentation
|
|
776
|
+
|
|
777
|
+
- **relational-databases.md**: Relational database fundamentals
|
|
778
|
+
- **relational-schema-design.md**: Schema design and normalization
|
|
779
|
+
- **relational-query-optimization.md**: Query optimization
|
|
780
|
+
- **performance-optimization.md**: General performance optimization
|
|
781
|
+
- **security-standards.md**: Database security
|
|
782
|
+
|
|
783
|
+
|