@mytechtoday/augment-extensions 0.7.0 → 1.2.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.
Files changed (483) hide show
  1. package/AGENTS.md +265 -232
  2. package/README.md +956 -771
  3. package/augment-extensions/coding-standards/bash/README.md +196 -196
  4. package/augment-extensions/coding-standards/bash/module.json +163 -163
  5. package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
  6. package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
  7. package/augment-extensions/coding-standards/css/README.md +40 -40
  8. package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
  9. package/augment-extensions/coding-standards/css/module.json +44 -44
  10. package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
  11. package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
  12. package/augment-extensions/coding-standards/html/README.md +40 -40
  13. package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
  14. package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
  15. package/augment-extensions/coding-standards/html/module.json +44 -44
  16. package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
  17. package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
  18. package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
  19. package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
  20. package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
  21. package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
  22. package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
  23. package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
  24. package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
  25. package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
  26. package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
  27. package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
  28. package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
  29. package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
  30. package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
  31. package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
  32. package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
  33. package/augment-extensions/coding-standards/js/README.md +46 -46
  34. package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
  35. package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
  36. package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
  37. package/augment-extensions/coding-standards/js/module.json +49 -49
  38. package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
  39. package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
  40. package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
  41. package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
  42. package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
  43. package/augment-extensions/coding-standards/php/README.md +248 -248
  44. package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
  45. package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
  46. package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
  47. package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
  48. package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
  49. package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
  50. package/augment-extensions/coding-standards/php/module.json +166 -166
  51. package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
  52. package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
  53. package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
  54. package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
  55. package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
  56. package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
  57. package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
  58. package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
  59. package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
  60. package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
  61. package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
  62. package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
  63. package/augment-extensions/coding-standards/php/rules/security.md +358 -358
  64. package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
  65. package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
  66. package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
  67. package/augment-extensions/coding-standards/powershell/README.md +154 -154
  68. package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
  69. package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
  70. package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
  71. package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
  72. package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
  73. package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
  74. package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
  75. package/augment-extensions/coding-standards/powershell/module.json +165 -165
  76. package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
  77. package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
  78. package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
  79. package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
  80. package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
  81. package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
  82. package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
  83. package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
  84. package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
  85. package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
  86. package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
  87. package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
  88. package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
  89. package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
  90. package/augment-extensions/coding-standards/python/README.md +48 -48
  91. package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
  92. package/augment-extensions/coding-standards/python/module.json +30 -30
  93. package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
  94. package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
  95. package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
  96. package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
  97. package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
  98. package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
  99. package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
  100. package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
  101. package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
  102. package/augment-extensions/coding-standards/react/README.md +45 -45
  103. package/augment-extensions/coding-standards/react/module.json +27 -27
  104. package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
  105. package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
  106. package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
  107. package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
  108. package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
  109. package/augment-extensions/coding-standards/typescript/README.md +45 -45
  110. package/augment-extensions/coding-standards/typescript/module.json +27 -27
  111. package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
  112. package/augment-extensions/collections/html-css-js/README.md +82 -82
  113. package/augment-extensions/collections/html-css-js/collection.json +41 -41
  114. package/augment-extensions/domain-rules/api-design/README.md +41 -41
  115. package/augment-extensions/domain-rules/api-design/module.json +27 -27
  116. package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
  117. package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
  118. package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
  119. package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
  120. package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
  121. package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
  122. package/augment-extensions/domain-rules/database/README.md +161 -161
  123. package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
  124. package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
  125. package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
  126. package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
  127. package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
  128. package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
  129. package/augment-extensions/domain-rules/database/module.json +28 -28
  130. package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
  131. package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
  132. package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
  133. package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
  134. package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
  135. package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
  136. package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
  137. package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
  138. package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
  139. package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
  140. package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
  141. package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
  142. package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
  143. package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
  144. package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
  145. package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
  146. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
  147. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
  148. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
  149. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
  150. package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
  151. package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
  152. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
  153. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
  154. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
  155. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
  156. package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
  157. package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
  158. package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
  159. package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
  160. package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
  161. package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
  162. package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
  163. package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
  164. package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
  165. package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
  166. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
  167. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
  168. package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
  169. package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
  170. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
  171. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
  172. package/augment-extensions/domain-rules/mcp/README.md +150 -150
  173. package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
  174. package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
  175. package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
  176. package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
  177. package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
  178. package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
  179. package/augment-extensions/domain-rules/mcp/module.json +49 -49
  180. package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
  181. package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
  182. package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
  183. package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
  184. package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
  185. package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
  186. package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
  187. package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
  188. package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
  189. package/augment-extensions/domain-rules/security/README.md +41 -41
  190. package/augment-extensions/domain-rules/security/module.json +28 -28
  191. package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
  192. package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
  193. package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
  194. package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
  195. package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
  196. package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
  197. package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
  198. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
  199. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
  200. package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
  201. package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
  202. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
  203. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
  204. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
  205. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
  206. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
  207. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
  208. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
  209. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
  210. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
  211. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
  212. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
  213. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
  214. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
  215. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
  216. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
  217. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
  218. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
  219. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
  220. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
  221. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
  222. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
  223. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
  224. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
  225. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
  226. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
  227. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
  228. package/augment-extensions/domain-rules/wordpress/README.md +163 -163
  229. package/augment-extensions/domain-rules/wordpress/module.json +32 -32
  230. package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
  231. package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
  232. package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
  233. package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
  234. package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
  235. package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
  236. package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
  237. package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
  238. package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
  239. package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
  240. package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
  241. package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
  242. package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
  243. package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
  244. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
  245. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
  246. package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
  247. package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
  248. package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
  249. package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
  250. package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
  251. package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
  252. package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
  253. package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
  254. package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
  255. package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
  256. package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
  257. package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
  258. package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
  259. package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
  260. package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
  261. package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
  262. package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
  263. package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
  264. package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
  265. package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
  266. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
  267. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
  268. package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
  269. package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
  270. package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
  271. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
  272. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
  273. package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
  274. package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
  275. package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
  276. package/augment-extensions/examples/design-patterns/README.md +37 -37
  277. package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
  278. package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
  279. package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
  280. package/augment-extensions/examples/design-patterns/module.json +27 -27
  281. package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
  282. package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
  283. package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
  284. package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
  285. package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
  286. package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
  287. package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
  288. package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
  289. package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
  290. package/augment-extensions/workflows/beads/README.md +135 -135
  291. package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
  292. package/augment-extensions/workflows/beads/module.json +55 -55
  293. package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
  294. package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
  295. package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
  296. package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
  297. package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
  298. package/augment-extensions/workflows/beads-integration/README.md +143 -143
  299. package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
  300. package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
  301. package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
  302. package/augment-extensions/workflows/beads-integration/module.json +75 -75
  303. package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
  304. package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
  305. package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
  306. package/augment-extensions/workflows/database/README.md +195 -195
  307. package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
  308. package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
  309. package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
  310. package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
  311. package/augment-extensions/workflows/database/module.json +42 -42
  312. package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
  313. package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
  314. package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
  315. package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
  316. package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
  317. package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
  318. package/augment-extensions/workflows/database/rules/workflow.md +458 -458
  319. package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
  320. package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
  321. package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
  322. package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
  323. package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
  324. package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
  325. package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
  326. package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
  327. package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
  328. package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
  329. package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
  330. package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
  331. package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
  332. package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
  333. package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
  334. package/augment-extensions/writing-standards/screenplay/README.md +339 -300
  335. package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
  336. package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
  337. package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
  338. package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
  339. package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
  340. package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
  341. package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
  342. package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
  343. package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
  344. package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
  345. package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
  346. package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
  347. package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
  348. package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
  349. package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
  350. package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
  351. package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
  352. package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
  353. package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
  354. package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
  355. package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
  356. package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
  357. package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
  358. package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
  359. package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
  360. package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
  361. package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
  362. package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
  363. package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
  364. package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
  365. package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
  366. package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
  367. package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
  368. package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
  369. package/augment-extensions/writing-standards/screenplay/module.json +124 -124
  370. package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
  371. package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
  372. package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
  373. package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
  374. package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
  375. package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
  376. package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
  377. package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
  378. package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
  379. package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
  380. package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
  381. package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
  382. package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
  383. package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
  384. package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
  385. package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
  386. package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
  387. package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
  388. package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
  389. package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
  390. package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
  391. package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
  392. package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
  393. package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
  394. package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
  395. package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
  396. package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
  397. package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
  398. package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
  399. package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
  400. package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
  401. package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
  402. package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
  403. package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
  404. package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
  405. package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
  406. package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
  407. package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
  408. package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
  409. package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
  410. package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
  411. package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
  412. package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
  413. package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
  414. package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
  415. package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
  416. package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
  417. package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
  418. package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
  419. package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
  420. package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
  421. package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
  422. package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
  423. package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
  424. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
  425. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
  426. package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
  427. package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
  428. package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
  429. package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
  430. package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
  431. package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
  432. package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
  433. package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
  434. package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
  435. package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
  436. package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
  437. package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
  438. package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
  439. package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
  440. package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
  441. package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
  442. package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
  443. package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
  444. package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
  445. package/cli/MODULES.md +302 -302
  446. package/cli/dist/cli.js +109 -22
  447. package/cli/dist/cli.js.map +1 -1
  448. package/cli/dist/commands/gui.d.ts.map +1 -1
  449. package/cli/dist/commands/gui.js +54 -6
  450. package/cli/dist/commands/gui.js.map +1 -1
  451. package/cli/dist/commands/init.d.ts.map +1 -1
  452. package/cli/dist/commands/init.js +76 -23
  453. package/cli/dist/commands/init.js.map +1 -1
  454. package/cli/dist/commands/self-remove.d.ts.map +1 -1
  455. package/cli/dist/commands/self-remove.js +48 -74
  456. package/cli/dist/commands/self-remove.js.map +1 -1
  457. package/cli/dist/commands/show.d.ts +11 -0
  458. package/cli/dist/commands/show.d.ts.map +1 -1
  459. package/cli/dist/commands/show.js +120 -0
  460. package/cli/dist/commands/show.js.map +1 -1
  461. package/cli/dist/commands/showCompleted.d.ts +21 -0
  462. package/cli/dist/commands/showCompleted.d.ts.map +1 -0
  463. package/cli/dist/commands/showCompleted.js +225 -0
  464. package/cli/dist/commands/showCompleted.js.map +1 -0
  465. package/cli/dist/commands/skill.js +88 -88
  466. package/cli/dist/commands/update.d.ts +2 -0
  467. package/cli/dist/commands/update.d.ts.map +1 -1
  468. package/cli/dist/commands/update.js +67 -1
  469. package/cli/dist/commands/update.js.map +1 -1
  470. package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
  471. package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
  472. package/cli/dist/utils/beadsCompletedChecker.js +198 -0
  473. package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
  474. package/cli/dist/utils/catalog-sync.js +13 -13
  475. package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
  476. package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
  477. package/cli/dist/utils/extractCommandHelp.js +250 -0
  478. package/cli/dist/utils/extractCommandHelp.js.map +1 -0
  479. package/cli/dist/utils/install-rules.js +55 -55
  480. package/cli/dist/utils/mcp-integration.js +44 -44
  481. package/cli/dist/utils/rule-install-hooks.js +8 -8
  482. package/modules.md +667 -630
  483. package/package.json +85 -85
@@ -1,783 +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
-
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
+