{"id":29198,"date":"2026-09-12T08:29:50","date_gmt":"2026-09-12T08:29:50","guid":{"rendered":"https:\/\/umang.pk\/2026\/09\/12\/%d8%ac%db%8c%d9%86%da%af%d9%88-%d9%85%db%8c%da%ba-%d8%b1%db%8c%d8%b3-%da%a9%db%92-%d8%ad%d8%a7%d9%84%d8%a7%d8%aa-%da%a9%d9%88-%da%a9%db%8c%d8%b3%db%92-%d8%b1%d9%88%da%a9%d8%a7-%d8%ac%d8%a7%d8%a6%db%92\/"},"modified":"2026-09-12T08:29:50","modified_gmt":"2026-09-12T08:29:50","slug":"%d8%ac%db%8c%d9%86%da%af%d9%88-%d9%85%db%8c%da%ba-%d8%b1%db%8c%d8%b3-%da%a9%db%92-%d8%ad%d8%a7%d9%84%d8%a7%d8%aa-%da%a9%d9%88-%da%a9%db%8c%d8%b3%db%92-%d8%b1%d9%88%da%a9%d8%a7-%d8%ac%d8%a7%d8%a6%db%92","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/09\/12\/%d8%ac%db%8c%d9%86%da%af%d9%88-%d9%85%db%8c%da%ba-%d8%b1%db%8c%d8%b3-%da%a9%db%92-%d8%ad%d8%a7%d9%84%d8%a7%d8%aa-%da%a9%d9%88-%da%a9%db%8c%d8%b3%db%92-%d8%b1%d9%88%da%a9%d8%a7-%d8%ac%d8%a7%d8%a6%db%92\/","title":{"rendered":"\u062c\u06cc\u0646\u06af\u0648 \u0645\u06cc\u06ba \u0631\u06cc\u0633 \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0631\u0648\u06a9\u0627 \u062c\u0627\u0626\u06d2\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06cc AI \u0627\u06cc\u067e \u0645\u06cc\u06ba \u06a9\u0627\u0641\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u0628\u0627\u0642\u06cc \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0627\u06cc\u06a9 \u0628\u0631\u0627\u0624\u0632\u0631 \u0679\u06cc\u0628 \u0645\u06cc\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0645\u0639 \u06a9\u0631\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u067e\u06c1\u0644\u06cc \u0679\u06cc\u0628 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0679\u06cc\u0628 \u0645\u06cc\u06ba \u062f\u0648\u0633\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0645\u0639 \u06a9\u0631\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u067e \u062f\u0648\u0646\u0648\u06ba \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u06d2 \u06a9\u0631\u06cc\u0688\u0679 \u0686\u06cc\u06a9 \u067e\u0627\u0633 \u06a9\u06cc\u0627\u06d4 \u062a\u0627\u06c1\u0645\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u06d2 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06d4 \u06c1\u0645 \u0646\u06d2 \u0627\u0628\u06be\u06cc \u062c\u0633 \u0631\u062c\u062d\u0627\u0646 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u0631\u06cc\u0633 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u06c1\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648 \u0633\u0648\u0627\u0644 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba \u06c1\u0645 \u0627\u0646 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 Django \u06a9\u0631\u06cc\u0688\u0679 \u0633\u0633\u0679\u0645 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0628\u06af \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u0634 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0633\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646\u0632 \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u0644\u0627\u06a9\u0646\u06af \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0679\u06be\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062c\u0627\u0646\u0686\u06cc\u06ba \u06a9\u06c1 \u062c\u0628 \u062f\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0622\u062e\u0631\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0642\u0627\u0628\u0644\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u062a\u0648 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-what-well-cover\">\u062c\u0633 \u06a9\u0627 \u06c1\u0645 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/h2>\n<h2 id=\"heading-who-this-guide-is-for\">\u06cc\u06c1 \u06af\u0627\u0626\u06cc\u0688 \u06a9\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2\u06d4<\/h2>\n<p>\u06cc\u06c1 \u06af\u0627\u0626\u06cc\u0688 \u0627\u0646 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2 \u062c\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc Django \u06a9\u0648 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0644\u06cc\u06a9\u0646 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0627\u0688\u0644\u0632\u060c \u0646\u0642\u0644 \u0645\u06a9\u0627\u0646\u06cc \u0627\u0648\u0631 \u0622\u0631\u0627\u0621 \u0633\u06d2 \u0648\u0627\u0642\u0641\u06cc\u062a \u0622\u067e \u06a9\u0648 \u0645\u062b\u0627\u0644\u0648\u06ba \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u06d2 \u06af\u06cc\u06d4 \u06cc\u06c1\u0627\u06ba \u062f\u06a9\u06be\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 Python 3.12 \u0627\u0648\u0631 Docker with Compose \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0686\u0648\u0646\u06a9\u06c1 SQLite \u0642\u0637\u0627\u0631 \u0644\u0627\u06a9\u0646\u06af \u06a9\u0648 \u0644\u0627\u06af\u0648 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u06c1\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u060c \u06c1\u0645 Django 5.2\u060c Django REST Framework 3.16\u060c \u0627\u0648\u0631 PostgreSQL 17 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062c\u06be\u06d2 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u06d2 \u062a\u0635\u0648\u0631 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0635\u0648\u06cc\u0631 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u067e\u0648\u0631\u06d2 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u0646\u0642\u0644\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645\u0627\u0631\u0627 API \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0642\u0628\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u0642\u0644\u06cc \u0646\u062a\u0627\u0626\u062c \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc AI \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06cc\u0627 \u0627\u062f\u0627 \u0634\u062f\u06c1 API \u06a9\u0644\u06cc\u062f \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0639\u0645\u0644 \u06a9\u0648 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u0648\u06ba \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u067e\u0631 \u0645\u0631\u06a9\u0648\u0632 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u062a\u0635\u0648\u06cc\u0631 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06cc \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0645\u06a9\u0645\u0644 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-what-concurrency-and-race-conditions-mean\">\u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0627\u0648\u0631 \u0646\u0633\u0644 \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u06a9\u0627 \u06a9\u06cc\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2\u06d4<\/h2>\n<h3 id=\"heading-what-is-concurrency\">\u06a9\u0646\u06a9\u0631\u0646\u0633\u06cc \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>\u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u062f\u0648 \u06cc\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0648\u0642\u062a \u06a9\u06d2 \u0627\u0648\u0648\u0631 \u0644\u06cc\u067e\u0646\u06af \u0627\u062f\u0648\u0627\u0631 \u0645\u06cc\u06ba \u06c1\u0648 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u062c\u0628 \u062f\u0631\u062e\u0648\u0627\u0633\u062a A \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06d2 \u062c\u0648\u0627\u0628 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631 \u0631\u06c1\u06cc \u06c1\u06d2\u060c \u0633\u0631\u0648\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a B \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0645\u0627\u0646\u0688\u0632 \u06a9\u0648 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u0644\u0648\u067e \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0633\u0648\u0626\u0686 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2 \u062c\u0633 \u0633\u06d2 Python \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062a\u0641\u0635\u06cc\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u067e\u06c1\u0644\u0627 \u06a9\u0627\u0645 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0627\u0645 \u0622\u06af\u06d2 \u0628\u0691\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-what-is-a-race-condition\">\u0631\u06cc\u0633 \u06a9\u06cc \u0634\u0631\u0637 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>\u062f\u0648\u0691 \u06a9\u06cc \u062d\u0627\u0644\u062a \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0646\u0642\u0635 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u06cc \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u0627 \u0627\u0646\u062d\u0635\u0627\u0631 \u0633\u0645\u0648\u0631\u062a\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u06d2 \u0648\u0642\u062a \u06cc\u0627 \u062a\u0631\u062a\u06cc\u0628 \u067e\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u0633\u0627 \u0627\u0633 \u0648\u0642\u062a \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u0627\u0645 \u0688\u06cc\u0679\u0627 \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u0645\u0646\u0627\u0633\u0628 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0631\u0628\u0648\u0637 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0639\u0645\u0644 \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u0633\u062a \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u0646 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0627\u06ba \u0628\u06be\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0648\u0633\u0631\u06d2 \u0627\u0639\u0645\u0627\u0644 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648 \u0686\u06a9\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u067e\u06be\u0627\u0646\u0633\u06cc \u06a9\u0627 \u062d\u06a9\u0645 \u0645\u062e\u062a\u0644\u0641 \u06c1\u06d2 \u062a\u0648 \u06cc\u06c1 \u063a\u0644\u0637 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0628\u0627\u0639\u062b \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0646\u0642\u0644 \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0648\u0691 \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u0627\u06cc\u0633\u06d2 \u06a9\u06cc\u0691\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u06a9\u0633\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0646\u0642\u0644 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u06d2 \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-where-else-can-race-conditions-happen\">\u06a9\u06cc\u0627 \u0631\u06cc\u0633 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u061f<\/h3>\n<p>\u0631\u06cc\u0633 \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u06a9\u0627\u0624\u0646\u0679\u0631\u0632\u060c \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633\u060c \u067e\u0633 \u0645\u0646\u0638\u0631 \u06a9\u06d2 \u06a9\u0627\u0645\u0648\u06ba\u060c \u0627\u0648\u0631 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u062f\u06a9\u06be\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0634\u0631\u06cc\u06a9 \u0627\u06cc\u06a9 \u0634\u062e\u0635 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u062f\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u060c \u06cc\u0627 \u0627\u06cc\u06a9 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0627\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0635\u0627\u0631\u0641 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u0648 \u0633\u06a9\u062a\u06cc\u06d4 \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0648\u0633\u06cc\u0644\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0642\u0637\u0627\u0631\u060c \u0641\u0627\u0626\u0644\u060c \u0627\u0646 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0648\u06cc\u0644\u06cc\u0648\u060c \u06cc\u0627 \u06a9\u0633\u06cc \u0635\u0641\u062d\u06c1 \u06a9\u06cc \u0645\u0648\u062c\u0648\u062f\u06c1 \u062d\u0627\u0644\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0630\u06cc\u0644 \u06a9\u06cc \u0645\u062b\u0627\u0644\u06cc\u06ba \u06a9\u0626\u06cc \u0637\u0631\u06cc\u0642\u06d2 \u062f\u06a9\u06be\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0646 \u0645\u06cc\u06ba \u062a\u0631\u062a\u06cc\u0628 \u0627\u06c1\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062d\u0627\u0644\u062a \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u0633\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06cc \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0633\u06cc \u0627\u06cc\u06a9 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u0648\u06a9 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-a-view-counter-loses-an-update\">\u0648\u06cc\u0648 \u06a9\u0627\u0624\u0646\u0679\u0631 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u06be\u0648 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/h4>\n<p>\u06c1\u0645 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u062f\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u06c1\u0645 \u0627\u06cc\u06a9 \u067e\u0648\u0633\u0679 \u067e\u0631 \u0645\u0644\u0627\u062d\u0638\u0627\u062a \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f 100 \u0633\u06d2 \u0628\u0691\u06be\u0627\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0648\u06c1 \u062f\u0648\u0646\u0648\u06ba 100 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u067e\u0646\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631 \u0644\u06d2\u06d4 \u06c1\u0631 \u0627\u06cc\u06a9 1 \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 101 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0624\u0646\u0679\u0631 \u06a9\u0648 102 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u067e \u0688\u06cc\u0679 \u0636\u0627\u0626\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u06af\u0645\u0634\u062f\u06c1 \u0627\u067e \u0688\u06cc\u0679 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0645\u06cc\u06ba \u062e\u0631\u06cc\u062f\u0627\u0631\u06cc \u06cc\u0627 \u0645\u062d\u062f\u0648\u062f \u0627\u0633\u0679\u0627\u06a9 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-two-signups-claim-the-same-username\">\u062f\u0648 \u0633\u0628\u0633\u06a9\u0631\u067e\u0634\u0646\u0632 \u0627\u06cc\u06a9 \u06c1\u06cc \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u06a9\u0627 \u062f\u0639\u0648\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h4>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0635\u0631\u0641 \u0645\u0645\u06a9\u0646\u06c1 \u0635\u0627\u0631\u0641 \u0646\u0627\u0645\u0648\u06ba \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0627 \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646 \u0641\u0627\u0631\u0645 \u0627\u06cc\u06a9 \u0631\u06cc\u0633 \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u062f\u0633\u062a\u06cc\u0627\u0628 \u067e\u0627\u0626\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u0633 \u0646\u0627\u0645 \u0633\u06d2 \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0627\u0646\u0641\u0631\u0627\u062f\u06cc\u062a \u06a9\u06d2 \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u062a\u06cc\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u062a\u062d\u0641\u0638 \u0645\u06cc\u06ba \u067e\u0686\u06be\u0644\u06d2 \u0686\u06cc\u06a9\u0648\u06ba \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0627\u0646\u0641\u0631\u0627\u062f\u06cc\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u0646\u0627 \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-two-workers-pick-the-same-job\">\u062f\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0627\u0645 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h4>\n<p>\u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0648\u0631\u06a9\u0631 \u0646\u0627\u062f\u0627\u0646\u0633\u062a\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u06cc \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u06a9\u0627\u0645 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u0646\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u062d\u0627\u0644\u062a \u06a9\u0648 \u067e\u0691\u06be\u0627\u06d4 \u06c1\u0631 \u0634\u062e\u0635 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0645 \u0645\u0645\u06a9\u0646 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u067e\u0631 \u06a9\u0627\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062f\u0648 \u0628\u0627\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06be\u06cc\u062c \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u06cc\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc \u0631\u067e\u0648\u0631\u0679 \u062f\u0648 \u0628\u0627\u0631 \u062a\u06cc\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u0627\u0633\u06a9 \u0628\u0644\u0646\u06af \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u06a9\u0648 \u06a9\u0627\u0645 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0644\u06a9\u06cc\u062a \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h4 id=\"heading-an-older-search-response-replaces-a-newer-one\">\u067e\u0631\u0627\u0646\u06d2 \u062a\u0644\u0627\u0634 \u06a9\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u0646\u0626\u06d2 \u062a\u0644\u0627\u0634 \u06a9\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h4>\n<p>\u0686\u0648\u0646\u06a9\u06c1 \u062c\u0648\u0627\u0628\u0627\u062a \u062a\u0631\u062a\u06cc\u0628 \u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u0622\u062a\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u0627 \u0628\u0631\u0627\u0624\u0632\u0631 \u063a\u0644\u0637 \u062a\u0644\u0627\u0634 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u062f\u06a9\u06be\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>&quot;Jjango&#8221; \u0679\u0627\u0626\u067e \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u067e\u06c1\u0644\u0627 \u062c\u0648\u0627\u0628 \u0622\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062a\u0644\u0627\u0634 \u06a9\u0648 &quot;Jjango \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646&#8221; \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0648\u0633\u0631\u0627 \u062c\u0648\u0627\u0628 \u067e\u06c1\u0644\u06d2 \u0622\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0628 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0646\u062a\u06cc\u062c\u06c1 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u067e\u06c1\u0644\u0627 \u062c\u0648\u0627\u0628 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0622\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u063a\u06cc\u0631 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0627\u0633\u06d2 \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0635\u0641\u062d\u06c1 \u067e\u0686\u06be\u0644\u06cc \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u062f\u06a9\u06be\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0644\u0627\u06a9 \u06a9\u0631\u0646\u0627 \u06a9\u0648\u0626\u06cc \u0645\u062a\u0639\u0644\u0642\u06c1 \u062d\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06cc\u0627 \u0628\u0627\u0633\u06cc \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-the-credit-check-can-fail\">\u06a9\u0631\u06cc\u0688\u0679 \u0686\u06cc\u06a9 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u0634\u0631\u0648\u0639 \u0645\u06cc\u06ba \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u067e\u0631 1 \u06a9\u0631\u06cc\u0688\u0679 \u0644\u0627\u06af\u062a \u0622\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0631\u06cc\u0688\u0679 \u0627\u06cc\u067e \u06a9\u06d2 \u0622\u067e \u06a9\u06d2 \u0627\u062c\u0627\u0632\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u06d2 \u0679\u0648\u06a9\u0646\u0632 \u0633\u06d2 \u0627\u0644\u06af \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0627 \u0627\u0635\u0648\u0644 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 10 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e 9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06cc \u0645\u0646\u0638\u0648\u0631\u06cc \u06a9\u06d2 \u0628\u0639\u062f 1 \u0645\u0632\u06cc\u062f \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0642\u0628\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u067e\u0633\u062f\u06cc\u062f \u06a9\u0648:<\/p>\n<ol>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0627 \u0628\u06cc\u0644\u0646\u0633 \u067e\u0691\u06be\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 1 \u06a9\u0631\u06cc\u0688\u0679 \u0628\u0627\u0642\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u0648 \u06a9\u0645 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u067e\u0646\u0627 \u0628\u06cc\u0644\u0646\u0633 \u0628\u0686\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0642\u0628\u0648\u0644 \u0634\u062f\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u0627\u0633 \u0639\u0645\u0644 \u06a9\u06d2 \u062f\u0631\u0633\u062a \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u067e\u0631\u060c \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 0 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u06c1 0 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0631\u06a9 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u06cc\u06a9\u0633\u0627\u06ba \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06cc \u062c\u0627\u0646\u0686 \u067e\u0691\u062a\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u0646 \u06a9\u0627 \u0639\u0645\u0644 \u0627\u0648\u0648\u0631\u0644\u06cc\u067e \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-what-happens-when-two-requests-overlap\">\u0627\u06af\u0631 \u062f\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0648\u0648\u0631\u0644\u06cc\u067e \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u062a\u0648 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a A \u0627\u06a9\u0627\u0624\u0646\u0679 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a B \u0627\u0633\u06cc \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u0628\u06be\u06cc \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0628 \u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u067e\u0627\u0633 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u06a9\u0627\u067e\u06cc \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0686\u06cc\u06a9 \u067e\u0627\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u06af\u0646\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>1 - 1 = 0<\/code>. A \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a 0 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u0633\u0644 \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a B \u067e\u06be\u0631 0 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u06cc \u0646\u0633\u0644 \u06a9\u0648 \u0644\u0627\u06af \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062d\u062a\u0645\u06cc \u0628\u06cc\u0644\u0646\u0633 0 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u06d2 \u062f\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0642\u0628\u0648\u0644 \u06a9\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0645\u0646\u0641\u06cc \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0627\u0633 \u062e\u0627\u0635 \u063a\u0644\u0637\u06cc \u0633\u06d2 \u0645\u062d\u0631\u0648\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u063a\u0644\u0637\u06cc \u06a9\u0633\u06cc \u0642\u06cc\u0645\u062a \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u0646\u0627 \u06c1\u06d2 \u062c\u0628 \u062f\u0648\u0633\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0627\u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0648\u0642\u0639 \u0645\u0644\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0648\u0631\u0698\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-set-up-the-django-project\">\u062c\u06cc\u0646\u06af\u0648 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0627\u06cc\u06a9 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0627\u0648\u0631 \u0648\u0631\u0686\u0648\u0626\u0644 \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0630\u06cc\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9\u0679\u06cc\u0648\u06cc\u0634\u0646 \u06a9\u0645\u0627\u0646\u0688 \u0644\u06cc\u0646\u06a9\u0633 \u0627\u0648\u0631 \u0645\u06cc\u06a9 \u0627\u0648 \u0627\u06cc\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\">mkdir django-credit-demo\ncd django-credit-demo\npython3.12 -m venv .venv\nsource .venv\/bin\/activate\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0627\u067e\u0646\u06cc \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0627\u0648\u0631 \u0627\u0632\u06af\u0631 \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u062b\u0627\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>mkdir<\/code>    \u0627\u06cc\u06a9 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba <code>cd<\/code> \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>venv<\/code> \u06a9\u0645\u0627\u0646\u0688 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0645\u0627\u062d\u0648\u0644 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>.venv<\/code>. \u06a9\u06c1 <code>source<\/code> \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u067e\u06cc\u06a9\u06cc\u062c \u06a9\u06cc \u062a\u0646\u0635\u06cc\u0628\u0627\u062a \u0627\u0633 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u06d4<\/p>\n<p>\u0646\u06cc\u0686\u06d2 \u062f\u06cc \u06af\u0626\u06cc \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0648 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0641\u0639\u0627\u0644 \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p>\u0648\u0646\u0688\u0648\u0632 \u0645\u06cc\u06ba <code>py -3.12 -m venv .venv<\/code> \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c <code>.venv\\Scripts\\Activate.ps1<\/code> \u067e\u0627\u0648\u0631 \u0634\u06cc\u0644 \u0633\u06d2 \u0641\u0639\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>requirements.txt<\/code>:<\/p>\n<pre><code class=\"language-plaintext\">Django>=5.2,<5.3\ndjangorestframework>=3.16,<3.17\npsycopg[binary]>=3.2,<3.3\n<\/code><\/pre>\n<p>\u0627\u0633 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u062a\u06cc\u0646 \u067e\u06cc\u06a9\u062c\u0648\u06ba \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u06c1\u06d2\u06d4<\/p>\n<p>Django \u0645\u0627\u0688\u0644 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u0648\u0644\u0632 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 Django REST Framework \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u06a9\u0627\u062a \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2\u06d4 Psycopg PostgreSQL \u06a9\u0646\u06cc\u06a9\u0679\u06cc\u0648\u06cc\u0679\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 <code>[binary]<\/code> \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0646\u0641\u0627\u0630 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba\u06d4 \u06c1\u0631 \u0648\u0631\u0698\u0646 \u06a9\u06cc \u062d\u062f \u062f\u0631\u062c \u0630\u06cc\u0644 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u06a9\u0631\u060c \u0645\u0646\u062a\u062e\u0628 \u0631\u06cc\u0644\u06cc\u0632 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2:<\/p>\n<p>\u0627\u06cc\u06a9 \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u06a9\u06cc \u0641\u0627\u0626\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06af\u0627\u0626\u06cc\u0688 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06c1\u0631 \u0641\u0631\u062f \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0648\u0627\u0636\u062d \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06cc\u06a9\u06cc\u062c \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c <code>credits<\/code>:<\/p>\n<pre><code class=\"language-plaintext\">python -m pip install -r requirements.txt\npython -m django startproject config .\npython manage.py startapp credits\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688\u0632 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0688\u06be\u0627\u0646\u0686\u06c1 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>pip install -r<\/code>    \u067e\u06cc\u06a9\u06cc\u062c \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u067e\u0691\u06be\u06cc\u06ba\u06d4 <code>requirements.txt<\/code>. \u06a9\u06c1 <code>startproject<\/code> \u062d\u06a9\u0645 \u06c1\u06d2\u06d4 <code>config<\/code> \u067e\u06cc\u06a9\u062c \u0627\u0648\u0631 <code>manage.py<\/code>\u0622\u062e\u0631\u06cc \u0688\u0627\u0679 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>startapp<\/code> \u062d\u06a9\u0645 \u06c1\u06d2\u06d4 <code>credits<\/code> \u06cc\u06c1 \u0648\u06c1 \u067e\u06cc\u06a9\u062c \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0645\u0627\u0688\u0644\u0632\u060c \u0633\u0631\u0648\u0633 \u0641\u0646\u06a9\u0634\u0646\u0632\u060c \u0648\u06cc\u0648\u0632 \u0627\u0648\u0631 \u0679\u06cc\u0633\u0679 \u0631\u06c1\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 Django \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0633\u06d2 \u062c\u0691\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-start-postgresql\">PostgreSQL \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>compose.yaml<\/code> \u06a9\u06d2 \u067e\u0627\u0633 <code>manage.py<\/code>:<\/p>\n<pre><code class=\"language-plaintext\">services:\n  db:\n    image: postgres:17\n    environment:\n      POSTGRES_DB: credit_demo\n      POSTGRES_USER: credit_demo\n      POSTGRES_PASSWORD: local-demo-only\n    ports:\n      - \"127.0.0.1:5433:5432\"\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U credit_demo -d credit_demo\"]\n      interval: 2s\n      timeout: 5s\n      retries: 15\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u0645\u0642\u0627\u0645\u06cc \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 PostgreSQL \u06a9\u0646\u0679\u06cc\u0646\u0631 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>image<\/code>    PostgreSQL 17 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0627\u0642\u062f\u0627\u0631 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0648\u0631 \u0645\u0642\u0627\u0645\u06cc \u0627\u0633\u0646\u0627\u062f \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u067e\u0648\u0631\u0679 \u0645\u06cc\u067e\u0646\u06af \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0635\u0631\u0641 \u067e\u0648\u0631\u0679 \u067e\u0631 \u06a9\u0645\u067e\u06cc\u0648\u0679\u0631 \u06a9\u06d2 \u0644\u0648\u067e \u0628\u06cc\u06a9 \u0627\u06cc\u0688\u0631\u06cc\u0633 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>5433<\/code>. \u0635\u062d\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 <code>pg_isready<\/code> \u06c1\u0631 \u062f\u0648 \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba \u067e\u0627\u0646\u0686 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u06a9\u0648 \u063a\u06cc\u0631 \u0635\u062d\u062a \u0628\u062e\u0634 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 15 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u0648\u06ba \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u06cc\u0646\u06af\u0648 \u0627\u067e\u0646\u06cc \u0633\u06cc\u0679\u0646\u06af\u0632 \u0645\u06cc\u06ba \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u0627\u0646 \u06c1\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-plaintext\">docker compose up -d --wait\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0627\u0633 \u0645\u06cc\u06ba \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2: <code>compose.yaml<\/code>.<\/p>\n<p><code>up<\/code>    \u0633\u0631\u0648\u0633 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u06c1 <code>-d<\/code> \u062c\u06be\u0646\u0688\u0627 \u0627\u0633\u06d2 \u067e\u0633 \u0645\u0646\u0638\u0631 \u0645\u06cc\u06ba \u0686\u0644\u0646\u06d2 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633 \u0633\u06d2 \u0622\u067e \u0679\u0631\u0645\u06cc\u0646\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u06c1 <code>--wait<\/code> \u062c\u06be\u0646\u0688\u0627 \u0635\u062d\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u0635\u062d\u062a \u0645\u0646\u062f \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u06a9\u0648 \u067e\u0648\u0631\u06d2 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u0686\u0644\u0627\u062a\u06d2 \u0631\u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-configure-django\">\u062c\u06cc\u0646\u06af\u0648 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646<\/h3>\n<p>\u062a\u0628\u062f\u06cc\u0644\u06cc <code>config\/settings.py<\/code> \u0627\u0633 \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u06d2 \u0633\u0627\u062a\u06be:<\/p>\n<pre><code class=\"language-python\">import os\n\nSECRET_KEY = \"local-tutorial-only-do-not-use-in-production\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\", \"testserver\"]\nINSTALLED_APPS = [\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"rest_framework\",\n    \"credits\",\n]\nMIDDLEWARE = []\nROOT_URLCONF = \"config.urls\"\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\nUSE_TZ = True\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.postgresql\",\n        \"NAME\": os.environ.get(\"DB_NAME\", \"credit_demo\"),\n        \"USER\": os.environ.get(\"DB_USER\", \"credit_demo\"),\n        \"PASSWORD\": os.environ.get(\"DB_PASSWORD\", \"local-demo-only\"),\n        \"HOST\": os.environ.get(\"DB_HOST\", \"127.0.0.1\"),\n        \"PORT\": os.environ.get(\"DB_PORT\", \"5433\"),\n        \"OPTIONS\": {\"options\": \"-c lock_timeout=5000 -c statement_timeout=10000\"},\n    }\n}\nREST_FRAMEWORK = {\n    \"DEFAULT_AUTHENTICATION_CLASSES\": [\n        \"rest_framework.authentication.BasicAuthentication\",\n    ],\n    \"DEFAULT_PERMISSION_CLASSES\": [\n        \"rest_framework.permissions.IsAuthenticated\",\n    ],\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0641\u0627\u0626\u0644 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u062d\u0635\u0648\u06ba \u06a9\u0648 \u0622\u067e\u0633 \u0645\u06cc\u06ba \u062c\u0648\u0691\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>INSTALLED_APPS<\/code>    Django\u060c Django REST Framework \u0627\u0648\u0631 \u0645\u06cc\u06ba \u06cc\u0648\u0632\u0631 \u0633\u067e\u0648\u0631\u0679 <code>credits<\/code> \u0627\u06cc\u067e <code>ROOT_URLCONF<\/code> \u062c\u0628\u06a9\u06c1 \u06cc\u06c1 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>DEFAULT_AUTO_FIELD<\/code> \u0627\u0648\u0631 <code>USE_TZ<\/code> \u062e\u0648\u062f\u06a9\u0627\u0631 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0627\u0648\u0631 \u0679\u0627\u0626\u0645 \u0632\u0648\u0646 \u0633\u06d2 \u0622\u06af\u0627\u06c1\u06cc \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e\u06cc\u06ba \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4 \u062e\u0627\u0644\u06cc <code>MIDDLEWARE<\/code> \u0641\u06c1\u0631\u0633\u062a \u0627\u0633 API \u0645\u062b\u0627\u0644 \u06a9\u0648 \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 <code>ALLOWED_HOSTS<\/code> \u0645\u0642\u0627\u0645\u06cc \u067e\u062a\u0648\u06ba \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0645\u06cc\u0632\u0628\u0627\u0646\u0648\u06ba \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u06a9\u0627\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0628\u0646\u0627\u0626\u06cc \u06af\u0626\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u06c1 <code>DATABASES<\/code> \u06cc\u06c1 \u0633\u06cc\u06a9\u0634\u0646 \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 Django PostgreSQL \u062a\u06a9 \u06a9\u06cc\u0633\u06d2 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>ENGINE<\/code>    PostgreSQL \u067e\u0633\u062f\u06cc\u062f \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba\u06d4 \u06c1\u0631 \u0627\u06cc\u06a9 <code>os.environ.get()<\/code> \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u0645\u0645\u0627\u062b\u0644 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u0627\u0642\u062f\u0627\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u0691\u06be\u0627 \u0627\u0648\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u062e\u062a\u06cc\u0627\u0631\u0627\u062a 5 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u0627 \u0644\u0627\u06a9 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u0627\u0648\u0631 10 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u0627 \u0627\u0633\u0679\u06cc\u0679\u0645\u0646\u0679 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u0645\u0642\u0631\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u062e\u0644\u0644 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u063a\u06cc\u0631 \u0645\u0639\u06cc\u0646\u06c1 \u0645\u062f\u062a \u062a\u06a9 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u063a\u0644\u0637\u06cc \u067e\u06cc\u062f\u0627 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u0627\u06cc\u06a9 \u063a\u0644\u0637\u06cc \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u06c1\u06d2 \u0627\u0648\u0631 \u06cc\u06c1 \u0686\u06be\u0648\u0679\u0627 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u0627\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u062c\u0648\u0627\u0628 \u0641\u0631\u0627\u06c1\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06c1 <code>REST_FRAMEWORK<\/code> \u0633\u06cc\u06a9\u0634\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0633\u062a\u0646\u062f \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p><code>BasicAuthentication<\/code>    \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062f\u06c1 \u0627\u0633\u0646\u0627\u062f \u067e\u0691\u06be\u06cc\u06ba\u06d4 <code>IsAuthenticated<\/code> \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u067e\u0631\u0627\u0645\u067e\u0679 \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06af\u0645\u0646\u0627\u0645 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0648\u06ba \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u0645\u0648\u0646\u06c1 \u062e\u0641\u06cc\u06c1 \u06a9\u0644\u06cc\u062f \u0627\u0648\u0631 <code>DEBUG = True<\/code> \u06cc\u06c1 \u0645\u0642\u0627\u0645\u06cc \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0633\u06cc\u0679 \u0627\u067e \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u06d2 \u0631\u0627\u0632\u060c \u0645\u0646\u0627\u0633\u0628 \u062a\u0648\u062b\u06cc\u0642\u060c \u0627\u0648\u0631 \u0627\u0646\u06a9\u0631\u067e\u0679\u0688 \u06a9\u0646\u06a9\u0634\u0646 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0628\u062f\u06cc\u0644\u06cc <code>config\/urls.py<\/code> \u0631\u0648\u0679 \u0644\u0633\u0679 \u0627\u0628 \u062e\u0627\u0644\u06cc \u06c1\u06d2\u06d4 \u06a9\u0631\u06cc\u0688\u0679 \u0645\u0646\u0637\u0642 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">urlpatterns = []\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062e\u0627\u0644\u06cc \u0641\u06c1\u0631\u0633\u062a \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062c\u06cc\u0627\u0646\u06af\u0648 \u06a9\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u06cc\u0646\u06af\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4 <code>urlpatterns<\/code> \u0646\u0627\u0645\u06cc \u0645\u0627\u0688\u06cc\u0648\u0644 \u0645\u06cc\u06ba <code>ROOT_URLCONF<\/code>. \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0627\u06cc\u067e \u06a9\u0648 \u0641\u0639\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0645\u06cc\u06ba \u0646\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0627\u0646\u062a\u0638\u0627\u0645\u06cc \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u0627\u06d4 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0645\u0627\u0646\u0688\u0632 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06a9\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0628\u06be\u06cc \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u062d\u0641\u0648\u0638 \u0645\u0646\u0638\u0631 \u062a\u06cc\u0627\u0631 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0648 \u0628\u062f\u0644 \u062f\u0648\u06ba \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-create-the-models\">\u0645\u0627\u0688\u0644 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642<\/h3>\n<p>\u0627\u0633 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba: <code>credits\/models.py<\/code>:<\/p>\n<pre><code class=\"language-python\">from django.conf import settings\nfrom django.db import models\n\n\nclass CreditAccount(models.Model):\n    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)\n    balance = models.PositiveIntegerField(default=0)\n\n\nclass Generation(models.Model):\n    account = models.ForeignKey(CreditAccount, on_delete=models.CASCADE)\n    prompt = models.CharField(max_length=500)\n    status = models.CharField(max_length=20, default=\"reserved\")\n    created_at = models.DateTimeField(auto_now_add=True)\n<\/code><\/pre>\n<p><code>CreditAccount<\/code>    \u0635\u0627\u0631\u0641 \u0633\u06d2 \u0648\u0627\u0628\u0633\u062a\u06c1 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>settings.AUTH_USER_MODEL<\/code>    \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06a9\u0631\u062f\u06c1 \u0635\u0627\u0631\u0641 \u0645\u0627\u0688\u0644 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>OneToOneField<\/code> \u06c1\u0645 \u0641\u06cc \u0635\u0627\u0631\u0641 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>on_delete=models.CASCADE<\/code> \u062c\u0628 \u0622\u067e \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e Django \u06a9\u0648 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06c1\u0679\u0627\u0646\u06d2 \u06a9\u0648 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>PositiveIntegerField(default=0)<\/code> 0 \u06a9\u06cc \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0642\u062f\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0645\u0646\u0641\u06cc \u0639\u062f\u062f\u06cc \u062a\u0648\u0627\u0632\u0646 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u06cc\u0644\u0646\u0633 \u0641\u06cc\u0644\u0688 \u0627\u06cc\u06a9 \u0627\u0644\u0627\u0624\u0646\u0633 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0642\u0633\u0645 \u0627\u06a9\u06cc\u0644\u06d2 \u0641\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u0627\u06cc\u06a9 \u0646\u0633\u0644 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>Generation<\/code>    \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0646\u0638\u0648\u0631 \u0634\u062f\u06c1 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u063a\u06cc\u0631 \u0645\u0644\u06a9\u06cc \u0686\u0627\u0628\u06cc\u0627\u06ba \u06c1\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0648 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0633\u06d2 \u062c\u0648\u0691\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 \u0645\u062a\u0639\u062f\u062f \u0646\u0633\u0644\u06cc\u06ba \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 <code>prompt<\/code> 500 \u062d\u0631\u0648\u0641 \u062a\u06a9 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>created_at<\/code> \u062c\u0628 \u0642\u0637\u0627\u0631 \u0628\u0646\u062a\u06cc \u06c1\u06d2 \u062a\u0648 \u0644\u0627\u06af \u0627\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>status<\/code> \u06cc\u06c1 \u0627\u0633 \u0637\u0631\u062d \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2: <code>reserved<\/code>\u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0645\u0627\u0631\u06cc \u0633\u0631\u0648\u0633 \u0646\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631 \u062f\u06cc \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u0646\u0642\u0644\u06cc \u062a\u0635\u0648\u06cc\u0631\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06a9\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06af\u06be\u0631\u06cc\u0644\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u0645\u0644\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0646\u06d2 \u06a9\u062a\u0646\u0627 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u0679\u0648\u0627\u06cc\u0627 \u06c1\u06d2 \u0648\u06c1 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0622\u067e \u0646\u06d2 \u0627\u062f\u0627 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u062c\u0631\u062a\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\">python manage.py makemigrations credits\npython manage.py migrate\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0645\u0627\u0688\u0644 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0648 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u06cc\u0628\u0644 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>makemigrations credits<\/code>    \u0627\u06cc\u06a9 \u0645\u0646\u062a\u0642\u0644\u06cc \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba \u062c\u0648 \u0645\u0627\u0688\u0644 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u06d2\u06d4 <code>migrate<\/code> \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 Django \u06a9\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0645\u06cc\u0632 \u0627\u0648\u0631 \u062f\u0648 \u0646\u0626\u06cc \u0645\u06cc\u0632\u06cc\u06ba\u06d4 \u06a9\u0646\u06a9\u0634\u0646 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u0633\u06d2 \u0622\u0626\u06d2 \u06af\u0627 \u062c\u0648 \u0622\u067e \u0646\u06d2 \u0627\u0628\u06be\u06cc \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0628 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u0627\u0648\u0631 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-reproduce-the-race-condition\">\u0646\u0633\u0644 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u06cc\u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>credits\/services.py<\/code> \u062f\u0631\u062c \u0630\u06cc\u0644 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-python\">from .models import CreditAccount, Generation\n\n\nclass InsufficientCredits(Exception):\n    pass\n\n\ndef reserve_generation_unsafe(user_id, prompt):\n    account = CreditAccount.objects.get(user_id=user_id)\n\n    if account.balance < 1:\n        raise InsufficientCredits\n\n    account.balance -= 1\n    account.save(update_fields=[\"balance\"])\n\n    return Generation.objects.create(account=account, prompt=prompt)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0646\u06a9\u0631\u0646\u0633\u06cc \u06a9\u06d2 \u062a\u062d\u0641\u0638 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0631\u06cc\u0688\u0679 \u0686\u06cc\u06a9\u0646\u06af \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>objects.get()<\/code>    \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba\u06d4<code>user_id<\/code>\u0627\u0648\u0631 <code>raise InsufficientCredits<\/code> \u0627\u06af\u0631 \u0628\u06cc\u0644\u0646\u0633 1 \u0633\u06d2 \u06a9\u0645 \u06c1\u06d2 \u062a\u0648 \u06cc\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627 \u0628\u0646\u062f \u06a9\u0631 \u062f\u06d2 \u06af\u0627\u06d4 \u06af\u06be\u0679\u0627\u0624 \u0627\u06cc\u06a9 \u0627\u0632\u06af\u0631 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 <code>save(update_fields=[\"balance\"])<\/code> \u0627\u0633 \u0642\u062f\u0631 \u06a9\u0648 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0645\u06cc\u06ba \u0644\u06a9\u06be\u06cc\u06ba\u06d4 \u0622\u062e\u0631 \u06a9\u0627\u0631 <code>Generation.objects.create()<\/code> \u0642\u0628\u0648\u0644 \u0634\u062f\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u062a\u0639\u0644\u0642\u06c1 \u0645\u0627\u0688\u0644 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u0691\u06be\u0646\u0627 \u0627\u0648\u0631 \u0644\u06a9\u06be\u0646\u0627 \u0627\u0644\u06af \u0627\u0644\u06af \u06a9\u0627\u0645 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u062f\u0648\u0633\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>InsufficientCredits<\/code>    \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0646\u0627\u06a9\u0627\u0645\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>Python \u06a9\u06cc \u0627\u0633\u062a\u062b\u0646\u0627\u0626\u06cc \u06a9\u0644\u0627\u0633 \u0633\u06d2 \u0627\u062e\u0630 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u06a9 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u06a9\u0644\u0627\u0633\u06d4 <code>Exception<\/code>. \u06a9\u06c1 <code>pass<\/code> \u0628\u06cc\u0627\u0646 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0627\u0633 \u0637\u0628\u0642\u06d2 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0631\u0648\u06cc\u06c1 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0639\u062f \u0645\u06cc\u06ba\u060c \u0645\u0646\u0638\u0631 \u0627\u0633 \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0645\u0641\u06cc\u062f \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0648 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0631\u06a9\u06be\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0645\u0642\u0627\u0645\u0627\u062a \u06a9\u0648 \u0631\u0648\u0679 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-make-both-reads-happen-before-either-write\">\u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0648\u0646\u0648\u06ba \u067e\u0691\u06be\u0646\u06d2 \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u062f\u0648 \u0628\u0631\u0627\u0624\u0632\u0631 \u0679\u06cc\u0628\u0632 \u06a9\u0648 \u06a9\u06be\u0648\u0644\u0646\u0627 \u0628\u06af \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0637\u0631\u06cc\u0642\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0648\u0633\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0628\u06cc\u0644\u0646\u0633 \u067e\u0691\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06cc\u06c1 \u062f\u0648 \u062c\u06cc\u0646\u06af\u0648 \u0634\u06cc\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u062a\u0648\u0642\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0679\u0631\u0645\u06cc\u0646\u0644 \u06a9\u06be\u0648\u0644\u06cc\u06ba\u060c \u0648\u0631\u0686\u0648\u0626\u0644 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0686\u0627\u0644\u0648 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0634\u06cc\u0644 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-plaintext\">python manage.py shell\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0622\u067e \u06a9\u06d2 \u062c\u06cc\u0627\u0646\u06af\u0648 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u0648\u0688 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0627\u0632\u06af\u0631 \u06a9\u0627 \u0634\u06cc\u0644 \u06a9\u06be\u0648\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba: <code>manage.py<\/code>. \u0622\u067e \u0645\u0627\u0688\u0644\u0632 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062a\u0631\u062a\u06cc\u0628 \u0634\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0633\u06d2 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0679\u0631\u0645\u06cc\u0646\u0644 \u062c\u0633\u06d2 \u0622\u067e \u06a9\u06be\u0648\u0644\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u062c\u0631\u0628\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u0634\u06cc\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0627\u0646 \u0634\u06cc\u0644\u0648\u06ba \u06a9\u0648 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06d2 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0622\u0631\u0688\u0631 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0635\u0627\u0631\u0641 \u0627\u0648\u0631 1 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-python\">from django.contrib.auth import get_user_model\nfrom credits.models import CreditAccount, Generation\n\nuser = get_user_model().objects.create_user(username=\"race-demo\")\nCreditAccount.objects.create(user=user, balance=1)\n\naccount_a = CreditAccount.objects.get(user__username=\"race-demo\")\nprint(account_a.balance)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u0644\u0627\u06a9 1 \u06a9\u06d2 \u062a\u0648\u0627\u0632\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u06c1\u0644\u0627 \u0622\u067e\u0631\u06cc\u0634\u0646 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>get_user_model()<\/code>    \u06a9\u0646\u0641\u06cc\u06af\u0631 \u0634\u062f\u06c1 \u06cc\u0648\u0632\u0631 \u06a9\u0644\u0627\u0633 \u06a9\u0648 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 <code>create_user()<\/code> \u0688\u06cc\u0645\u0648 \u0635\u0627\u0631\u0641 \u062f\u0627\u062e\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062c\u0628 \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u060c \u0635\u0627\u0631\u0641 \u06a9\u0648 1 \u06a9\u0631\u06cc\u0688\u0679 \u062a\u0641\u0648\u06cc\u0636 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0644\u0627\u0634 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>user__username<\/code> \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u062a\u0639\u0644\u0642\u0627\u062a \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u0627\u06a9\u0627\u0624\u0646\u0679 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba\u06d4 <code>account_a<\/code>.<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u067e\u0631\u0646\u0679 \u0622\u0624\u0679 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4<code>1<\/code>. \u0627\u067e\u0646\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633 \u0634\u06cc\u0644 \u06a9\u0648 \u06a9\u06be\u0644\u0627 \u0631\u06c1\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0627\u0633\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0686\u0627\u0644\u0648 \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4 <code>python manage.py shell<\/code> \u062f\u0648\u0628\u0627\u0631\u06c1 \u0648\u06c1 \u06a9\u06c1\u0627\u0646\u06cc \u0628\u06be\u06cc \u067e\u0691\u06be\u06cc\u06ba:<\/p>\n<pre><code class=\"language-python\">from credits.models import CreditAccount, Generation\n\naccount_b = CreditAccount.objects.get(user__username=\"race-demo\")\nprint(account_b.balance)\n<\/code><\/pre>\n<p>\u062f\u0648\u0633\u0631\u0627 \u0634\u06cc\u0644 \u0627\u0633\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0627\u0632\u06af\u0631 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u0637\u0631\u062d \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>account_b<\/code>    \u06cc\u06c1 \u0627\u0633 \u062e\u0648\u0644 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0633\u06d2 \u0627\u0644\u06af \u06c1\u06d2: <code>account_a<\/code>. \u0686\u0648\u0646\u06a9\u06c1 \u067e\u06c1\u0644\u06d2 \u0634\u06cc\u0644 \u0646\u06d2 \u06a9\u0679\u0648\u062a\u06cc \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062a\u06be\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u0633 \u0633\u0648\u0627\u0644 \u06a9\u0648 1 \u06a9\u0627 \u0628\u06cc\u0644\u0646\u0633 \u0628\u06be\u06cc \u0644\u0648\u0679\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u0634\u06cc\u0644 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u06cc\u06c1 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062a\u0627\u0632\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u0631\u06cc\u0688\u0679\u0633 \u06a9\u06cc \u0627\u06cc\u06a9 \u06a9\u0627\u067e\u06cc \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u0634\u06cc\u0644 \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-python\">if account_a.balance >= 1:\n    account_a.balance -= 1\n    account_a.save(update_fields=[\"balance\"])\n    Generation.objects.create(account=account_a, prompt=\"A garden\")\n<\/code><\/pre>\n<p>\u0627\u0628 \u067e\u06c1\u0644\u0627 \u0634\u06cc\u0644 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0627\u067e\u06cc \u0686\u06cc\u06a9 \u06a9\u0631\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u06a9\u06c1 <code>if<\/code> \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0634\u0631\u0637 \u06af\u0632\u0631 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 <code>account_a.balance<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u062c\u0628 \u0645\u0646\u06c1\u0627 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u06cc\u06c1 0 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c <code>save()<\/code> \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba 0 \u0644\u06a9\u06be\u06cc\u06ba\u06d4 \u0622\u062e\u0631\u06cc \u0644\u0627\u0626\u0646 \u06af\u0627\u0631\u0688\u0646 \u067e\u0631\u0627\u0645\u067e\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0646\u0633\u0644 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u0631\u0645\u06cc\u0646\u0644\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0628\u0644\u0627\u06a9 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062e\u0627\u0644\u06cc \u0644\u0627\u0626\u0646 \u067e\u0631 Enter \u062f\u0628\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0627\u0633 \u0628\u0644\u0627\u06a9 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06d2 \u0634\u06cc\u0644 \u0645\u06cc\u06ba \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">if account_b.balance >= 1:\n    account_b.balance -= 1\n    account_b.save(update_fields=[\"balance\"])\n    Generation.objects.create(account=account_b, prompt=\"A beach\")\n<\/code><\/pre>\n<p>\u062f\u0648\u0633\u0631\u0627 \u0634\u06cc\u0644 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0628\u06be\u0631\u06cc \u06c1\u0648\u0626\u06cc \u0627\u0634\u06cc\u0627\u0621 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06c1 <code>if<\/code> \u062d\u0627\u0644\u062a \u0627\u0628 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u062a\u0627\u0632\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>account_b<\/code>. 1 \u06a9\u0648 \u06af\u06be\u0679\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 0 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0633\u06cc \u0642\u062f\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0679 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0622\u067e \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0644\u06a9\u06be\u0627 \u062a\u06be\u0627\u06d4 \u067e\u06be\u0631 \u0628\u06cc\u0686 \u067e\u0631\u0627\u0645\u067e\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u062a\u062e\u0644\u06cc\u0642 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u067e \u0646\u06d2 \u06a9\u0631\u06cc\u0688\u0679\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0679\u0627\u0633\u06a9 \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u06cc\u0627 \u062c\u0648 \u0622\u067e \u067e\u06c1\u0644\u06d2 \u06a9\u0627\u0645 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0686\u06a9\u06d2 \u062a\u06be\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06d2 \u0634\u06cc\u0644 \u0645\u06cc\u06ba \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">account_b.refresh_from_db()\nprint(account_b.balance)\nprint(Generation.objects.filter(account=account_b).count())\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u0644\u0627\u06a9 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u06d2 \u0630\u062e\u06cc\u0631\u06c1 \u0634\u062f\u06c1 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>refresh_from_db()<\/code>    \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u067e\u0631\u0646\u0679\u0646\u06af \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0627\u0642\u062f\u0627\u0631 \u06a9\u06cc \u0639\u06a9\u0627\u0633\u06cc \u06a9\u0631\u06d2\u06d4 \u0641\u0644\u0679\u0631 <code>count()<\/code> \u0635\u0631\u0641 \u0627\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06af\u06be\u0631\u0627\u0646\u0648\u06ba \u06a9\u0648 \u0634\u0645\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 0 \u06a9\u0631\u06cc\u0688\u0679\u0633 \u0627\u0648\u0631 2 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u06af\u06be\u0631\u0627\u0646\u0648\u06ba \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0627\u0646 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0635\u0631\u0641 \u062a\u0648\u0627\u0632\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0686\u06be\u067e\u0627\u06cc\u0627 \u0646\u06c1\u06cc\u06ba \u062c\u0627 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<p>\u062f\u0648 \u062e\u0648\u0644\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0622\u067e \u06a9\u0648 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06c1\u0631 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0631\u06a9 \u06af\u06cc\u0627 \u0627\u0648\u0631 \u067e\u06be\u0631 \u062f\u0648\u0646\u0648\u06ba \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06d4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0627\u0648\u0648\u0631\u0644\u06cc\u067e \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0633\u0631\u0648\u0631 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0622\u0631\u0688\u0631 \u062a\u06cc\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0627\u06af\u0631 \u0622\u067e \u06c1\u0631 \u0628\u0627\u0631 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u067e\u0631 \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u062a\u062c\u0631\u0628\u06c1 \u062f\u06c1\u0631\u0627\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u0627\u0648\u0631 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u067e\u0686\u06be\u0644\u06cc \u062a\u0627\u0631\u06cc\u062e \u0622\u067e \u06a9\u06cc \u06af\u0646\u062a\u06cc \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u0646\u06c1 \u06a9\u0631\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u06c1\u0645 \u0627\u0646 \u0639\u06cc\u0646 \u062e\u0627\u0644\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u062a\u062d\u0641\u0638 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0627 \u06c1\u0645 \u0646\u06d2 \u0645\u0634\u0627\u06c1\u062f\u06c1 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-protect-the-balance\">\u0627\u067e\u0646\u06d2 \u062a\u0648\u0627\u0632\u0646 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06d2 \u062f\u0648 \u0645\u0633\u0627\u0626\u0644 \u06c1\u06cc\u06ba: \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u0679\u0648\u062a\u06cc \u0627\u0648\u0631 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0644 \u06a9\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0645\u0633\u0627\u0628\u0642\u062a\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u0627\u0648\u0631 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u0631\u0628\u0648\u0637 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u06cc \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u06cc\u06ba \u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u0627\u0646 \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u0648\u06ba \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-keep-related-changes-in-one-transaction\">\u0627\u06cc\u06a9 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0645\u06cc\u06ba \u0645\u062a\u0639\u0644\u0642\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0631\u06a9\u06be\u06cc\u06ba<\/h3>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646<\/strong> \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0679\u0627\u0633\u06a9 \u06cc\u0648\u0646\u0679\u0648\u06ba \u0645\u06cc\u06ba \u06af\u0631\u0648\u067e \u06a9\u0631\u06cc\u06ba\u06d4 \u062c\u06cc\u0646\u06af\u0648 \u06a9\u0627 <code>transaction.atomic()<\/code> \u0627\u06af\u0631 \u0628\u0644\u0627\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06c1\u0645 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u0631\u062a\u06a9\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u0628\u0644\u0627\u06a9 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u06c1\u0645 \u0648\u0627\u067e\u0633 \u0644\u0648\u0679 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0641\u0646\u06a9\u0634\u0646 \u0627\u067e\u0646\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062a\u0648\u0627\u0632\u0646 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u062a\u0648\u060c \u06a9\u0679\u0648\u062a\u06cc\u0648\u06ba \u06a9\u0648 \u0645\u062c\u0627\u0632 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062b\u0627\u0644\u06cc \u0645\u0642\u0627\u0635\u062f \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06a9\u0627\u0645 \u06a9\u0648 \u0633\u0645\u06cc\u0679\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1\u0627\u06ba \u06c1\u06d2:<\/p>\n<pre><code class=\"language-python\">from django.db import transaction\n\n\n@transaction.atomic\ndef reserve_generation_atomic_only(user_id, prompt):\n    account = CreditAccount.objects.get(user_id=user_id)\n\n    if account.balance < 1:\n        raise InsufficientCredits\n\n    account.balance -= 1\n    account.save(update_fields=[\"balance\"])\n\n    return Generation.objects.create(account=account, prompt=prompt)\n<\/code><\/pre>\n<p>\u0688\u06cc\u06a9\u0648\u0631\u06cc\u0679\u0631 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u0679\u0645\u06cc \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>from django.db import transaction<\/code>    \u062c\u06cc\u0627\u0646\u06af\u0648 \u06a9\u06d2 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0679\u0648\u0644\u0632 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0641\u0646\u06a9\u0634\u0646 \u0627\u0628 \u0628\u06be\u06cc \u0627\u06a9\u0627\u0624\u0646\u0679 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0679\u0648\u062a\u06cc\u0648\u06ba \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u0646\u0633\u0644\u06cc\u06ba \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06a9\u0648\u0626\u06cc \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0633\u06d2 \u06a9\u0679\u0648\u062a\u06cc \u0628\u06be\u06cc \u0648\u0627\u067e\u0633 \u0644\u06d2 \u0644\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06a9\u0679\u0648\u062a\u06cc\u0648\u06ba \u0627\u0648\u0631 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u062a\u0639\u0644\u0642 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u0686\u06cc\u06a9 \u0627\u0628 \u0628\u06be\u06cc \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0627\u0646\u06a9\u0648\u0627\u0626\u0631\u06cc \u0645\u06cc\u06ba \u0633\u0627\u0645\u0646\u06d2 \u0622\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>PostgreSQL \u0631\u06cc\u0688 \u06a9\u0645\u0679 \u06a9\u0648 \u0627\u067e\u0646\u06cc \u0688\u06cc\u0641\u0627\u0644\u0679 \u0622\u0626\u0633\u0648\u0644\u06cc\u0634\u0646 \u0644\u06cc\u0648\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2\u060c \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0646\u0627\u0631\u0645\u0644 \u0631\u06cc\u0688\u0632 \u062f\u06cc\u06af\u0631 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u0642\u0637\u0627\u0631 \u067e\u0691\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06d2 \u06af\u06cc\u06d4 \u0644\u06c1\u0630\u0627 \u062f\u0648\u0646\u0648\u06ba \u0641\u0646\u06a9\u0634\u0646\u0632 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u067e\u0691\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0648\u0627\u0632\u0646 \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-lock-the-account-before-the-balance-check\">\u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0644\u0627\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0642\u0637\u0627\u0631 \u0628\u0646\u062f \u06a9\u0631\u0646\u0627 \u0627\u06cc\u06a9 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u06c1\u06d2\u06d4 <strong>\u0645\u0646\u062a\u062e\u0628 \u0642\u0637\u0627\u0631\u0648\u06ba \u067e\u0631 \u0645\u062a\u0636\u0627\u062f \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u06c1 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0645\u06cc\u06ba \u062a\u0627\u0644\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/strong><\/p>\n<p>\u0627\u0633 \u0645\u062b\u0627\u0644 \u0645\u06cc\u06ba\u060c \u0642\u0637\u0627\u0631 \u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0630\u062e\u06cc\u0631\u06c1 \u0634\u062f\u06c1 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>SELECT FOR UPDATE<\/code> \u062a\u0627\u0644\u06d2 \u0645\u0633\u0627\u0628\u0642\u062a\u06cc \u0627\u067e \u0688\u06cc\u0679\u0633 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0645\u062a\u0636\u0627\u062f \u0644\u0627\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u062a\u0627\u0644\u06d2 \u06a9\u06d2 \u062c\u0627\u0631\u06cc \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0646\u0627\u0631\u0645\u0644 \u0631\u06cc\u0688\u0632 \u062c\u0627\u0631\u06cc \u0631\u06c1 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646\u0632 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u062f\u0648\u0633\u0631\u06cc \u0642\u0637\u0627\u0631\u0648\u06ba \u067e\u0631 \u0686\u0644 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <code>from django.db import transaction<\/code> \u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631 <code>credits\/services.py<\/code>. \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0648 \u0631\u06a9\u06be\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u06af\u0644\u0627 \u0645\u062d\u0641\u0648\u0638 \u0648\u0631\u0698\u0646 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">@transaction.atomic\ndef reserve_generation(user_id, prompt):\n    account = CreditAccount.objects.select_for_update().get(user_id=user_id)\n\n    if account.balance < 1:\n        raise InsufficientCredits\n\n    account.balance -= 1\n    account.save(update_fields=[\"balance\"])\n\n    return Generation.objects.create(account=account, prompt=prompt)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0642\u0637\u0627\u0631 \u0644\u0627\u06a9 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>select_for_update()<\/code>    \u0627\u06cc\u06a9 \u062a\u0627\u0644\u0627 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba <code>.get(user_id=user_id)<\/code> \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062a\u0627\u0644\u0627 \u06a9\u0648 \u067e\u06a9\u0691\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06cc\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0631\u0642\u0645 \u0627\u06a9\u0679\u06be\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>InsufficientCredits<\/code> \u0627\u06af\u0631 \u0636\u0631\u0648\u0631\u06cc \u06c1\u0648 \u062a\u0648\u06d4 \u0628\u0635\u0648\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u0622\u067e \u06a9\u0679\u0648\u062a\u06cc \u06a9\u0648 \u0628\u0686\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u0627\u0648\u0631 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u0646\u0633\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0641\u06cc\u0635\u0644\u06d2 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0627\u0628 \u0627\u0633 \u0648\u0642\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0628 \u0622\u067e \u06a9\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648\u06d4<\/p>\n<p>\u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0645\u0633\u0627\u0628\u0642\u062a\u06cc \u06a9\u0627\u0644\u0632 \u06a9\u0648 \u0644\u0627\u06a9 \u06a9\u06d2 \u0633\u0648\u0627\u0644 \u067e\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u067e\u06c1\u0644\u06cc \u06a9\u0627\u0644 \u06a9\u0679\u0648\u062a\u06cc \u06a9\u0627 \u0627\u0631\u062a\u06a9\u0627\u0628 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0648\u06cc\u0679\u0646\u06af \u06a9\u0627\u0644 \u0627\u067e \u0688\u06cc\u0679 \u0634\u062f\u06c1 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 Read Committed \u0633\u06cc\u0679\u0646\u06af \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u067e\u06c1\u0644\u06cc \u06a9\u0627\u0644 \u0648\u0627\u067e\u0633 \u06a9\u0631 \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u06a9\u0679\u0648\u062a\u06cc \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u06cc\u06a9 \u062a\u0631\u062a\u06cc\u0628 \u0634\u062f\u06c1 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u0627\u06cc\u06a9 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>1 \u06a9\u0631\u06cc\u0688\u0679 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u067e\u06c1\u0644\u06cc \u06a9\u0645\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u062f\u0648\u0633\u0631\u06cc \u06a9\u0627\u0644 0 \u067e\u0691\u06be\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u062a\u062d\u0641\u0638 \u06a9\u0648 \u0627\u0646 \u062a\u0645\u0627\u0645 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062a\u0648\u0627\u0632\u0646 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u0686\u06be\u0644\u0627 \u0641\u0646\u06a9\u0634\u0646 \u0622\u067e \u06a9\u0648 \u0644\u0627\u06a9 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06a9\u0627\u0624\u0646\u0679 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u0627\u067e \u0688\u06cc\u0679\u0633 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u062a\u0627\u0644\u0627 \u0628\u0646\u062f \u0631\u06c1\u06d2 \u06af\u0627\u060c \u0644\u06cc\u06a9\u0646 \u067e\u0631\u0627\u0646\u06cc \u0627\u0642\u062f\u0627\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0679 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627\u060c \u0627\u0646\u062a\u0638\u0627\u0645\u06cc \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0627\u0648\u0631 \u067e\u0633 \u0645\u0646\u0638\u0631 \u06a9\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0645\u062d\u0641\u0648\u0638 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0645\u062d\u0641\u0648\u0638 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0633\u06cc \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0645\u0635\u0646\u0641 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06cc \u062c\u06af\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-keep-image-generation-outside-the-transaction\">\u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u06cc\u06ba<\/h3>\n<p>\u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0645\u06cc\u06ba \u06a9\u0631\u06cc\u0688\u0679 \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u0634\u0627\u0645\u0644 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0631\u06cc\u0645\u0648\u0679 \u0627\u0645\u06cc\u062c \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0642\u062a \u0644\u06af \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u0646\u06c1\u06cc\u06ba \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u0645\u0633\u0627\u0628\u0642\u062a\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u063a\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u06cc\u0645\u0648 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0633 \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba: <code>credits\/services.py<\/code>:<\/p>\n<pre><code class=\"language-python\">def simulate_generation(generation):\n    # No external AI request is made in this tutorial.\n    generation.status = \"completed\"\n    generation.save(update_fields=[\"status\"])\n    return \"Simulated image generation completed.\"\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u0627\u06cc\u06a9 \u0645\u0646\u0638\u0648\u0631 \u0634\u062f\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u06a9\u0648 \u0646\u0642\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062f\u06c1 \u062a\u0639\u0645\u06cc\u0631 \u0634\u062f\u06c1 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0645\u0648\u0627\u062f \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>status<\/code> \u06a9\u0648 <code>completed<\/code>. \u06a9\u06c1 <code>save()<\/code> \u06a9\u0627\u0644 \u0635\u0631\u0641 \u0627\u0633 \u0641\u06cc\u0644\u0688 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0642\u06cc\u0645\u062a \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u06c1\u06d2\u060c \u0641\u0646\u06a9\u0634\u0646 \u0646\u06c1 \u062a\u0648 \u06a9\u0648\u0626\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u0628\u06cc\u0631\u0648\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0627\u0633\u06d2 \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u06a9\u0627\u0644 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u062a\u0635\u0648\u06cc\u0631\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0646 \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0634\u0627\u0645\u0644 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u0633\u0645\u0648\u0644\u06cc\u0634\u0646 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u067e\u0648\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0627 \u06a9\u0631\u06cc\u0688\u0679 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0628\u062d\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648 \u06af\u0627\u06d4 \u062d\u0642\u06cc\u0642\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06cc\u0627 \u0631\u0642\u0645 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u067e\u0627\u0644\u06cc\u0633\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<p>\u062c\u0628 \u06c1\u0645 \u062e\u0648\u062f \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u0631 \u0644\u06cc\u06ba \u06af\u06d2 \u062a\u0648 \u06c1\u0645 \u0627\u0633 \u062d\u062f \u062a\u06a9 \u0648\u0627\u067e\u0633 \u0622 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-accept-and-test-image-requests\">\u062a\u0635\u0648\u06cc\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/h2>\n<p>\u0627\u0628 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0645\u062d\u0641\u0648\u0638 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u0633\u06d2 \u062c\u0648\u0691 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0648\u0688 \u06a9\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba: <code>credits\/views.py<\/code>:<\/p>\n<pre><code class=\"language-python\">from rest_framework import serializers, status\nfrom rest_framework.response import Response\nfrom rest_framework.views import APIView\nfrom .models import CreditAccount\nfrom .services import InsufficientCredits, reserve_generation, simulate_generation\n\n\nclass GenerationInput(serializers.Serializer):\n    prompt = serializers.CharField(max_length=500)\n\n\nclass GenerateView(APIView):\n    def post(self, request):\n        serializer = GenerationInput(data=request.data)\n        serializer.is_valid(raise_exception=True)\n        try:\n            generation = reserve_generation(\n                request.user.pk, serializer.validated_data[\"prompt\"]\n            )\n        except CreditAccount.DoesNotExist:\n            return Response({\"detail\": \"Credit account not found.\"}, status=404)\n        except InsufficientCredits:\n            return Response({\"detail\": \"Not enough credits.\"}, status=409)\n\n        result = simulate_generation(generation)\n        return Response(\n            {\"id\": generation.pk, \"status\": generation.status, \"result\": result},\n            status=status.HTTP_201_CREATED,\n        )\n<\/code><\/pre>\n<p>\u0633\u06cc\u0631\u06cc\u0644\u0627\u0626\u0632\u0631 \u067e\u0631\u0627\u0645\u067e\u0679\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0648\u06cc\u0648 \u06a9\u0631\u06cc\u0688\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06d2\u06d4<\/p>\n<p><code>GenerationInput<\/code>    500 \u062d\u0631\u0648\u0641 \u06a9\u06cc \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0644\u0645\u0628\u0627\u0626\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0637\u0644\u0648\u0628\u06c1 \u0679\u06cc\u06a9\u0633\u0679 \u0641\u06cc\u0644\u0688 \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u06cc\u06ba\u06d4 <code>is_valid(raise_exception=True)<\/code> \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u063a\u0627\u0626\u0628\u060c \u062e\u0627\u0644\u06cc\u060c \u06cc\u0627 \u063a\u0644\u0637 \u0627\u0646 \u067e\u0679 \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0646\u0638\u0631 \u067e\u06be\u0631 \u0635\u0627\u0641 \u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u06cc\u06c1\u0627\u06ba \u0633\u06d2: <code>validated_data<\/code> \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba <code>request.user.pk<\/code>\u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0645\u0633\u062a\u0646\u062f \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0688\u06cc\u0679\u0627\u0628\u06cc\u0633 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u06cc\u06a9 \u067e\u0631\u0627\u0645\u067e\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u06c1 \u0633\u0631\u0648\u0631 \u0627\u06cc\u06a9 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u0635\u0627\u0631\u0641 \u0633\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u062c\u0648\u0627\u0628 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06af\u0645\u0634\u062f\u06c1 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<code>404<\/code>\u0627\u0648\u0631 <code>InsufficientCredits<\/code> \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 <code>409<\/code>\u06cc\u06c1 \u062a\u0648\u0627\u0632\u0646 \u062a\u0646\u0627\u0632\u0639\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0645\u0627\u0631\u0627 \u0645\u0646\u062a\u062e\u0628 \u062c\u0648\u0627\u0628 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u0645\u0646\u0638\u0631 \u0646\u0642\u0644\u06cc \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2 <code>201<\/code> \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1\u060c \u062a\u06a9\u0645\u06cc\u0644 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a\u060c \u0627\u0648\u0631 \u0646\u0642\u0644\u06cc \u0646\u062a\u0627\u0626\u062c \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0634\u0627\u062e\u06cc\u06ba \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0648 \u0645\u0646\u0638\u0648\u0631 \u0634\u062f\u06c1 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u0627\u0648\u0631 \u0645\u0633\u062a\u0631\u062f \u0634\u062f\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0628\u062f\u06cc\u0644\u06cc <code>config\/urls.py<\/code> \u06a9\u06d2 \u0633\u0627\u062a\u06be:<\/p>\n<pre><code class=\"language-python\">from django.urls import path\nfrom credits.views import GenerateView\n\nurlpatterns = [\n    path(\"api\/generate\/\", GenerateView.as_view()),\n]\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0631\u0627\u0633\u062a\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u067e\u062a\u06d2 \u06a9\u0648 \u0645\u0646\u0638\u0631 \u0633\u06d2 \u062c\u0648\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>path()<\/code>    \u0645\u0639\u0627\u06c1\u062f\u06c1 <code>api\/generate\/<\/code> \u06cc\u06c1 \u0627\u06cc\u0688\u0631\u06cc\u0633 \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 <code>GenerateView.as_view()<\/code> \u06a9\u0644\u0627\u0633 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0646\u0638\u0627\u0631\u0648\u06ba \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0646\u0638\u0627\u0631\u0648\u06ba \u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be Django \u06af\u0632\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627 \u0646\u0638\u0627\u0631\u06c1 <code>post()<\/code> \u0637\u0631\u06cc\u0642\u06c1 \u0627\u0633 \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 POST \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u0627\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4 <code>\/api\/generate\/<\/code> \u062c\u0628 \u0633\u0631\u0648\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-try-one-request-at-a-time\">\u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u06cc\u06a9 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0622\u0632\u0645\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u062c\u06cc\u0646\u06af\u0648 \u0634\u06cc\u0644 \u06a9\u06be\u0648\u0644\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u0688\u06cc\u0645\u0648 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0644\u06af \u0635\u0627\u0631\u0641 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">from django.contrib.auth import get_user_model\nfrom credits.models import CreditAccount\n\nuser = get_user_model().objects.create_user(\n    username=\"api-demo\",\n    password=\"local-example-password\",\n)\nCreditAccount.objects.create(user=user, balance=1)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0628\u0644\u0627\u06a9 \u062a\u0648\u062b\u06cc\u0642 \u0634\u062f\u06c1 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>create_user()<\/code>    \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062f\u06c1 \u067e\u0627\u0633 \u0648\u0631\u0688 \u06a9\u0648 \u06c1\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>CreditAccount.objects.create()<\/code> \u06c1\u0645 \u0646\u0626\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 1 \u06a9\u0631\u06cc\u0688\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0644\u06af \u0627\u0644\u06af \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u0627\u0633 \u0686\u06cc\u06a9 \u06a9\u0648 2-\u0634\u06cc\u0644 \u062a\u062c\u0631\u0628\u06d2 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0633\u06d2 \u0622\u0632\u0627\u062f \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0630\u06cc\u0644 \u06a9\u06cc \u0627\u0633\u0646\u0627\u062f \u0635\u0631\u0641 \u0627\u0633 \u0645\u0642\u0627\u0645\u06cc \u0688\u06cc\u0645\u0648 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0634\u06cc\u0644 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0646\u06a9\u0644\u06cc\u06ba \u0627\u0648\u0631 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-plaintext\">python manage.py runserver\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u062c\u06cc\u0646\u06af\u0648 \u06a9\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u067e\u062a\u06c1 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u062f\u0644\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0627\u0633 \u0633\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>127.0.0.1:8000<\/code>. \u0627\u0633 \u067e\u062a\u06d2 \u0633\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0631\u0648\u0679 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0633\u06d2 \u06af\u0632\u0631\u06cc\u06ba \u06af\u06cc \u062c\u0633\u06d2 \u0622\u067e \u0646\u06d2 \u0627\u0628\u06be\u06cc \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0633\u0631\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0633\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0628\u06be\u06cc\u062c\u062a\u06d2 \u0648\u0642\u062a \u0627\u0633 \u0679\u0631\u0645\u06cc\u0646\u0644 \u06a9\u0648 \u06a9\u06be\u0644\u0627 \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0633\u0631\u0648\u0631 \u0635\u0631\u0641 \u0645\u0642\u0627\u0645\u06cc \u0688\u06cc\u0645\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0633\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u06be\u06cc\u062c\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">curl -i -u api-demo:local-example-password \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"prompt\": \"A garden at sunrise\"}' \\\n  http:\/\/127.0.0.1:8000\/api\/generate\/\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u067e\u0631 \u0688\u06cc\u0645\u0648 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0627\u0633\u0646\u0627\u062f \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u0627\u06cc\u06a9 \u067e\u0631\u0627\u0645\u067e\u0679 \u062c\u0645\u0639 \u06a9\u0631\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>-i<\/code>    \u062c\u0648\u0627\u0628\u06cc \u0639\u0646\u0648\u0627\u0646\u0627\u062a \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>-u<\/code> \u0628\u0646\u06cc\u0627\u062f\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u0646\u0627\u0645 \u0627\u0648\u0631 \u067e\u0627\u0633 \u0648\u0631\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 <code>-H<\/code> \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0646\u0648\u0679\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u06cc\u06ba (<strong>JSON<\/strong>) \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0628\u0627\u0688\u06cc \u0641\u0627\u0631\u0645\u06cc\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u06d4 <code>-d<\/code> \u0648\u06c1 \u0628\u0627\u0688\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0631\u0644 \u06a9\u0631 \u06a9\u06d2 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062f\u06c1 \u067e\u062a\u06d2 \u067e\u0631 \u067e\u0648\u0633\u0679 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u06be\u06cc\u062c\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u0627\u067e\u0633 \u0622\u0646\u06cc \u0686\u0627\u06c1\u0626\u06d2\u06d4 <code>201<\/code> \u062a\u062e\u0631\u0648\u067e\u0646 \u06a9\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u067e\u0646\u0627 \u0622\u0631\u0688\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u06be\u06cc\u062c\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0645 \u067e\u06c1\u0644\u06cc \u06a9\u0679\u0648\u062a\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u0622\u067e \u06a9\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0644\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u06ba \u0635\u0641\u0631 \u06a9\u0631\u06cc\u0688\u0679 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0627\u06cc\u06a9 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0648\u0627\u067e\u0633 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 <code>409<\/code> \u06a9\u06d2 \u0633\u0627\u062a\u06be <code>\"detail\": \"Not enough credits.\"<\/code>. \u0686\u0648\u0646\u06a9\u06c1 \u06c1\u0645 \u0646\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u06cc\u0627 \u062a\u06be\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06c1\u0645 \u06a9\u0648\u0626\u06cc \u0645\u0648\u0627\u0641\u0642\u062a \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u06c1\u0645 \u0635\u0631\u0641 \u0639\u0627\u0645 \u0622\u0631\u0688\u0631\u0646\u06af \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0644\u0627\u060c \u0622\u0626\u06cc\u06d2 \u0646\u06cc\u0633\u0679\u0688 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-set-up-the-automated-tests\">\u062e\u0648\u062f\u06a9\u0627\u0631 \u0679\u06cc\u0633\u0679 \u0633\u06cc\u0679 \u0627\u067e<\/h3>\n<p>\u062a\u0628\u062f\u06cc\u0644\u06cc <code>credits\/tests.py<\/code> \u062f\u0631\u062c \u0630\u06cc\u0644 \u0627\u0645\u067e\u0648\u0631\u0679 \u0627\u0648\u0631 \u0645\u062f\u062f\u06af\u0627\u0631 \u06a9\u0644\u0627\u0633\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba: \u06c1\u0645 \u0627\u06af\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u0679\u06cc\u0633\u0679 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">from concurrent.futures import ThreadPoolExecutor\nfrom threading import Barrier\nfrom unittest.mock import patch\n\nfrom django.contrib.auth import get_user_model\nfrom django.db import (\n    OperationalError, close_old_connections, connection, connections, transaction,\n)\nfrom django.test import TransactionTestCase\nfrom rest_framework.test import APIClient\n\nfrom .models import CreditAccount, Generation\nfrom .services import InsufficientCredits, reserve_generation, reserve_generation_unsafe\n\n\nclass ConcurrencyTests(TransactionTestCase):\n    def setUp(self):\n        if connection.vendor != \"postgresql\":\n            self.skipTest(\"Run these concurrency tests on PostgreSQL.\")\n\n        self.user = get_user_model().objects.create_user(username=\"parallel-reader\")\n        self.account = CreditAccount.objects.create(user=self.user, balance=1)\n\n    def run_two(self, action):\n        def worker():\n            close_old_connections()\n            try:\n                return action()\n            finally:\n                connections.close_all()\n\n        with ThreadPoolExecutor(max_workers=2) as pool:\n            futures = [pool.submit(worker) for _ in range(2)]\n            return [future.result(timeout=15) for future in futures]\n<\/code><\/pre>\n<p>\u0679\u06cc\u0633\u0679 \u06a9\u0644\u0627\u0633 \u06c1\u0631 \u06a9\u0646\u06a9\u0631\u0646\u0633\u06cc \u0679\u06cc\u0633\u0679 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>setUp()<\/code>    \u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 \u06a9\u0646\u06a9\u0634\u0646 PostgreSQL \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u0679\u06cc\u0633\u0679 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0635\u0627\u0631\u0641 \u0627\u0648\u0631 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 <code>TransactionTestCase<\/code> \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0628\u0631\u0639\u06a9\u0633\u060c \u06cc\u06c1 \u062d\u0642\u06cc\u0642\u06cc \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06cc \u062d\u062f\u0648\u062f \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<code>TestCase<\/code>\u0627\u0633 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0644\u0627\u06a9 \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u0686\u06be\u067e\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>SQLite \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0686\u06be\u0648\u0691\u06d2 \u06af\u0626\u06d2 \u0679\u06cc\u0633\u0679 PostgreSQL \u06a9\u06d2 \u0644\u0627\u06a9\u0646\u06af \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u06c1 <code>run_two()<\/code> \u0627\u06cc\u06a9 \u0645\u062f\u062f\u06af\u0627\u0631 \u062f\u0648\u0646\u0648\u06ba \u0648\u0631\u06a9\u0631 \u062a\u06be\u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u0627 \u06a9\u0627\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>ThreadPoolExecutor(max_workers=2)<\/code>    \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 <code>pool.submit(worker)<\/code> \u0627\u06cc\u06a9 \u06a9\u0627\u0644 \u06a9\u0627 \u0634\u06cc\u0688\u0648\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0645\u0633\u062a\u0642\u0628\u0644 \u0627\u0633 \u06a9\u0627\u0644 \u06a9\u06d2 \u062d\u062a\u0645\u06cc \u0646\u062a\u06cc\u062c\u06d2 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>future.result(timeout=15)<\/code> \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0628\u0691\u06be\u0627\u062a\u0627 \u06c1\u06d2: \u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0646\u0627\u0642\u0627\u0628\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0646\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u067e\u0646\u06d2 \u06a9\u0646\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u06d4<\/p>\n<p>\u06cc\u06c1 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0627\u0644\u06af \u0627\u0644\u06af \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-confirm-the-unsafe-behaviour\">\u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0633\u0644\u0648\u06a9 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u0633 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0648 \u0627\u0646\u062f\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<code>ConcurrencyTests<\/code>\u0627\u0633\u06cc \u0627\u0646\u0688\u06cc\u0646\u0679\u06cc\u0634\u0646 \u06a9\u06cc \u0633\u0637\u062d \u067e\u0631 <code>run_two()<\/code>:<\/p>\n<pre><code class=\"language-python\"> def test_reproduce_unsafe_spending(self):\n        both_have_read = Barrier(2)\n        original_get = CreditAccount.objects.get\n\n        def read_then_wait(*args, **kwargs):\n            account = original_get(*args, **kwargs)\n            both_have_read.wait(timeout=5)\n            return account\n\n        with patch(\n            \"credits.services.CreditAccount.objects.get\",\n            side_effect=read_then_wait,\n        ):\n            self.run_two(\n                lambda: reserve_generation_unsafe(self.user.pk, \"A garden\").pk\n            )\n\n        self.account.refresh_from_db()\n        self.assertEqual(self.account.balance, 0)\n        self.assertEqual(Generation.objects.count(), 2)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0679\u06cc\u0633\u0679 \u062f\u0648 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u0691\u06be\u0646\u06d2 \u067e\u0631 \u0645\u062c\u0628\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>original_get<\/code>    \u062d\u0642\u06cc\u0642\u06cc \u062e\u06cc\u0627\u0644\u0627\u062a \u06a9\u0627 \u0679\u0631\u06cc\u06a9 \u0631\u06a9\u06be\u06cc\u06ba <code>read_then_wait()<\/code> \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u062c\u06be\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>Barrier(2)<\/code>. \u0628\u06cc\u0631\u06cc\u0626\u0631 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u062f\u0648\u0646\u0648\u06ba \u06a9\u06d2 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u06cc \u0631\u06c1\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0627 \u0648\u0642\u062a \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u06a9\u0648\u0626\u06cc \u063a\u0644\u0637\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>patch()<\/code> \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0633\u0631\u0648\u0633 \u06a9\u06cc \u062a\u0644\u0627\u0634 \u06a9\u0648 \u0627\u0633 \u0631\u06cc\u067e\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0644\u0627\u06a9 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u06cc\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0631\u06cc\u0688\u0632 \u0644\u0627\u0626\u06cc\u0648 \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u06a9\u06c1 \u0679\u06cc\u0633\u0679 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0628\u0639\u062f \u06a9\u06d2 \u0648\u0642\u0641\u0648\u06ba \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062d\u062a\u0645\u06cc \u062f\u0644\u06cc\u0644 \u06a9\u06d2 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u063a\u0644\u0637 \u0646\u062a\u0627\u0626\u062c \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0644\u0679\u0644 \u0644\u06cc\u0645\u0628\u0688\u0627 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0627 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0646 \u062f\u0648\u0646\u0648\u06ba \u06a9\u06d2 \u0648\u0627\u067e\u0633 \u0622\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f <code>refresh_from_db()<\/code> \u0627\u067e\u0646\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0639\u0648\u06cc\u0670 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0679\u06cc\u0633\u0679 \u06a9\u0627 \u0646\u062a\u06cc\u062c\u06c1 \u0635\u0641\u0631 \u062a\u0648\u0627\u0632\u0646 \u0627\u0648\u0631 \u062f\u0648 \u0646\u0633\u0644\u0648\u06ba \u06a9\u0627 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0633\u06d2 \u06af\u0632\u0631\u0646\u0627 \u0628\u06af \u067e\u0646\u0631\u0648\u062a\u067e\u0627\u062f\u0646 \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0627\u0641\u0639\u0627\u0644 \u06a9\u06cc \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u0648 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-check-the-protected-endpoint\">\u0645\u062d\u0641\u0648\u0638 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u0633\u06cc \u06a9\u0644\u0627\u0633 \u0645\u06cc\u06ba \u062f\u0631\u062c \u0630\u06cc\u0644 \u0637\u0631\u06cc\u0642\u06c1 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-python\">def concurrent_api_requests(self):\n        ready = Barrier(2)\n\n        def send_request():\n            client = APIClient()\n            client.force_authenticate(self.user)\n            ready.wait(timeout=5)\n            return client.post(\n                \"\/api\/generate\/\",\n                {\"prompt\": \"A garden\"},\n                format=\"json\",\n            ).status_code\n\n        return self.run_two(send_request)\n\n    def test_last_credit_accepts_only_one_request(self):\n        self.assertEqual(sorted(self.concurrent_api_requests()), [201, 409])\n        self.account.refresh_from_db()\n        self.assertEqual(self.account.balance, 0)\n        self.assertEqual(Generation.objects.count(), 1)\n\n    def test_two_credits_accept_both_requests(self):\n        self.account.balance = 2\n        self.account.save(update_fields=[\"balance\"])\n\n        self.assertEqual(self.concurrent_api_requests(), [201, 201])\n        self.account.refresh_from_db()\n        self.assertEqual(self.account.balance, 0)\n        self.assertEqual(Generation.objects.count(), 2)\n<\/code><\/pre>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0645\u062f\u062f\u06af\u0627\u0631 \u0645\u062d\u0641\u0648\u0638 \u0645\u0646\u0638\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0648 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u067e\u0646\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<code>APIClient<\/code>\u0627\u0648\u0631 <code>force_authenticate()<\/code> \u067e\u0627\u0633 \u0648\u0631\u0688 \u06a9\u06d2 \u062a\u0628\u0627\u062f\u0644\u06d2 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u062f\u06cc\u0648\u0627\u0631 \u0633\u0627\u0645\u0646\u06d2 \u06c1\u06d2\u06d4 <code>post()<\/code> \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u06a9\u0627\u0644 \u06a9\u0648 \u062c\u0648\u0627\u0628\u06cc \u06a9\u0648\u0688 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>run_two()<\/code>.<\/p>\n<p>\u06cc\u06c1 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06a9\u06d2 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0679\u06cc\u0633\u0679 \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u06d2 \u0646\u0627\u06a9\u0627\u0641\u06cc \u0627\u0648\u0631 \u06a9\u0627\u0641\u06cc \u0645\u0634\u062a\u0631\u06a9\u06c1 \u06a9\u0631\u06cc\u0688\u0679\u0633 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u0679\u06cc\u0633\u0679 \u06a9\u0648\u0688 \u06a9\u0648 \u0633\u06cc\u062f\u06be\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u062a\u0648\u0642\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0631\u06a9\u0646\u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u06cc\u06a9\u06d4 <code>201<\/code> \u0627\u0648\u0631 \u0627\u06cc\u06a9 <code>409<\/code>. \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u0628\u06be\u06cc \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u0628\u0642\u06cc\u06c1 \u06a9\u0631\u06cc\u0688\u0679\u0633 0 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06cc\u06c1 \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0631\u06cc\u06a9\u0627\u0631\u0688\u0632 \u06a9\u06cc \u0628\u0627\u0644\u06a9\u0644 1 \u0646\u0633\u0644 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 2-\u06a9\u0631\u06cc\u0688\u0679 \u0679\u06cc\u0633\u0679 \u0622\u067e \u06a9\u06d2 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 2 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc\u0648\u06ba\u060c 2 \u06c1\u0679\u0633\u060c \u0627\u0648\u0631 0 \u06a9\u06d2 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u062a\u0648\u0642\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0627\u0648\u0631 \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u067e\u0691\u062a\u0627\u0644 \u0622\u067e \u06a9\u0648 \u0627\u0646 \u06af\u06be\u0631\u0627\u0646\u0648\u06ba \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u06d2 \u06af\u06cc \u062c\u0646\u06c1\u06cc\u06ba \u063a\u0644\u0637 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0646\u0638\u0648\u0631 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u0628\u06cc\u0631\u06cc\u0626\u0631 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06cc\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0648\u0633\u0631\u06cc \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0627\u0644\u06d2 \u06a9\u0648 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0631\u06a9\u0627\u0648\u0679 \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u062a\u0627\u0644\u0627 \u062d\u0627\u0635\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0627\u0646\u062a\u0638\u0627\u0645 \u0645\u0635\u0646\u0648\u0639\u06cc \u062a\u0639\u0637\u0644 \u06a9\u0648 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0645\u06a9\u0646\u06c1 \u0627\u062d\u06a9\u0627\u0645\u0627\u062a \u06a9\u0648 \u062b\u0627\u0628\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627\u06d4<\/p>\n<p>\u0627\u0633 \u0631\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0679\u06cc\u0633\u0679 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644\u0688 \u0631\u06cc \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0627\u0648\u0631 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-verify-the-service-encounters-a-held-lock\">\u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u0633\u0631\u0648\u0633 \u06a9\u0648 \u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627\u0621 \u0644\u0627\u06a9 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u067e\u0691\u0627<\/h3>\n<p>\u0622\u067e \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06cc\u06c1 \u0628\u06be\u06cc \u062c\u0627\u0646\u0686 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u0641\u0646\u06a9\u0634\u0646 \u0644\u0627\u06a9 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0646\u06cc\u0686\u06d2 \u062f\u06cc\u06d2 \u06af\u0626\u06d2 \u0679\u06cc\u0633\u0679 \u0635\u0641\u0631 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0631\u06cc\u0688\u0632 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0688\u06cc\u0641\u0627\u0644\u0679 \u06a9\u0646\u06a9\u0634\u0646 \u0648\u0631\u06a9\u0631 \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0644\u0627\u06a9 \u0622\u0624\u0679 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u06a9\u0627\u0631\u06a9\u0646 1 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06d2 \u0644\u0627\u06a9 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0635\u0644 \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0648 \u0627\u0646\u062f\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba: <code>ConcurrencyTests<\/code>:<\/p>\n<pre><code class=\"language-python\">    def test_reservation_waits_for_account_lock(self):\n        self.account.balance = 0\n        self.account.save(update_fields=[\"balance\"])\n        user_id = self.user.pk\n\n        def attempt_reservation():\n            close_old_connections()\n            try:\n                try:\n                    with transaction.atomic():\n                        with connection.cursor() as cursor:\n                            cursor.execute(\"SET LOCAL lock_timeout=\"1s\"\")\n                        reserve_generation(user_id, \"A garden\")\n                except OperationalError as error:\n                    return error.__cause__.sqlstate\n                except InsufficientCredits:\n                    return \"insufficient_credits\"\n                return \"accepted\"\n            finally:\n                connections.close_all()\n\n        with ThreadPoolExecutor(max_workers=1) as pool:\n            with transaction.atomic():\n                CreditAccount.objects.select_for_update().get(pk=self.account.pk)\n                result = pool.submit(attempt_reservation).result(timeout=5)\n                self.assertEqual(result, \"55P03\")\n\n            result = pool.submit(attempt_reservation).result(timeout=5)\n            self.assertEqual(result, \"insufficient_credits\")\n\n        self.account.refresh_from_db()\n        self.assertEqual(self.account.balance, 0)\n        self.assertEqual(Generation.objects.count(), 0)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0679\u06cc\u0633\u0679 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0646\u0679\u06cc\u0646\u0634\u0646 \u0644\u0627\u06a9 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u06d4<\/p>\n<p>\u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u06a9\u0646\u06a9\u0634\u0646 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u0648 \u06a9\u06be\u0644\u0627 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06d2 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631\u060c <code>SET LOCAL<\/code> \u0639\u0627\u0631\u0636\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0644\u0627\u06a9 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u06a9\u0648 \u0645\u062e\u062a\u0635\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 PostgreSQL \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4 <code>55P03<\/code> \u0627\u06cc\u0631\u0631 \u06a9\u0648\u0688 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2: <code>lock_not_available<\/code>\u062a\u0627\u0644\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0627 \u0648\u0642\u062a \u062e\u062a\u0645 \u06c1\u0648 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u0642\u0627\u0645 \u067e\u0631 \u0628\u06cc\u0644\u0646\u0633 \u0645\u06cc\u06ba \u06a9\u0645\u06cc \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0633\u0631\u0648\u0633 \u0646\u06d2 \u062a\u0635\u062f\u06cc\u0642 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0622\u067e \u06a9\u06d2 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0644\u0627\u06a9 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627\u06d4<\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0644\u0627\u06a9 \u06a9\u0648 \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u062f\u0648\u0633\u0631\u06cc \u06a9\u0627\u0644 \u0627\u0633\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0628\u0627\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0644\u0627\u06a9 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0632\u06cc\u0631\u0648 \u0628\u06cc\u0644\u0646\u0633 \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 <code>insufficient_credits<\/code> \u062d\u062a\u0645\u06cc \u062f\u0639\u0648\u06cc\u060c \u062c\u0648 \u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u063a\u0644\u0637\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648\u0634\u0634\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u06a9\u0648\u0626\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u06cc\u0627 \u06af\u06be\u0631\u06cc\u0644\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u062f\u0648 \u06a9\u0627\u0644\u06cc\u06ba \u062a\u0646\u0627\u0632\u0639\u0627\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648 \u0627\u0648\u0648\u0631 \u0644\u06cc\u067e\u0646\u06af \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u06c1\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0635\u0641\u0631 \u0628\u06cc\u0644\u0646\u0633 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u06cc\u0633\u0679 \u06a9\u0648 \u0645\u0632\u06cc\u062f \u0645\u062e\u0635\u0648\u0635 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u06a9 \u06a9\u0631\u06cc\u0688\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u060c \u062a\u0628 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0644\u0627\u06a9 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u063a\u06cc\u0631 \u0645\u062d\u0641\u0648\u0638 \u0641\u0646\u06a9\u0634\u0646 \u0628\u0627\u0644\u0622\u062e\u0631 \u0642\u0637\u0627\u0631 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0631\u06cc\u0688\u0679 0 \u06c1\u06d2\u060c \u062a\u0648 \u0641\u0646\u06a9\u0634\u0646 \u0627\u067e \u0688\u06cc\u0679 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u062a\u0648\u0642\u0639 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u062f\u0639\u0648\u06d2 \u06a9\u0648 \u0646\u0627\u06a9\u0627\u0645 \u0628\u0646\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06c1\u0670\u0630\u0627 \u0679\u06cc\u0633\u0679 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u0644\u0627\u06a9\u0646\u06af \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0628\u06a9\u06c1 \u067e\u0686\u06be\u0644\u0627 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u0679\u06cc\u0633\u0679 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u0644\u0627\u06a9\u0646\u06af \u0679\u06cc\u0633\u0679 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 PostgreSQL \u0679\u06cc\u0633\u0679 \u0633\u0648\u0679 \u06a9\u06d2 \u062d\u0635\u06d2 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u0627\u0633 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<h3 id=\"heading-check-rollback-after-a-failure\">\u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0628\u0627\u06c1\u0631 <code>ConcurrencyTests<\/code> \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u0644\u0627\u0633 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-python\">class CreditRollbackTests(TransactionTestCase):\n    def test_failed_record_creation_restores_credit(self):\n        user = get_user_model().objects.create_user(username=\"rollback-reader\")\n        account = CreditAccount.objects.create(user=user, balance=1)\n\n        with patch(\n            \"credits.services.Generation.objects.create\",\n            side_effect=RuntimeError(\"Simulated record creation failure\"),\n        ):\n            with self.assertRaises(RuntimeError):\n                reserve_generation(user.pk, \"A garden\")\n\n        account.refresh_from_db()\n        self.assertEqual(account.balance, 1)\n        self.assertEqual(Generation.objects.count(), 0)\n<\/code><\/pre>\n<p>\u062a\u062e\u0644\u06cc\u0642 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06cc\u06c1 \u0679\u06cc\u0633\u0679 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u06cc\u06a9 \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u067e\u06be\u06cc\u0646\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2\u060c 1 \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u067e\u06cc\u0686 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba <code>Generation.objects.create()<\/code> \u0627\u0679\u06be\u0627\u0646\u0627 <code>RuntimeError<\/code>\u0627\u0648\u0631 <code>assertRaises()<\/code> \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0631\u06cc\u0632\u0631\u0648\u06cc\u0634\u0646 \u0641\u0646\u06a9\u0634\u0646 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u062e\u062a\u0645 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u06a9\u0648 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0634\u062f\u06c1 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0645\u06cc\u06ba \u0627\u0628 \u0628\u06be\u06cc 1 \u06a9\u0631\u06cc\u0688\u0679 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u0627\u0648\u0631 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u0628\u06a9\u0646\u06af \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u06a9\u0679\u0648\u062a\u06cc \u0628\u0627\u0642\u06cc \u0646\u06c1\u06cc\u06ba \u0631\u06c1\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>PostgreSQL \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u067e\u0646\u06d2 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u060c \u062c\u0648 \u0627\u0628 \u0628\u06be\u06cc \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">python manage.py test credits -v 2\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0627\u0633 \u067e\u0631 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627\u062a\u06cc \u06c1\u06d2: <code>credits<\/code> \u0627\u06cc\u067e<\/p>\n<p><code>-v 2<\/code>    \u06c1\u0645 Django \u0633\u06d2 \u06c1\u0631 \u0627\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u062f\u06a9\u06be\u0627\u0646\u06d2 \u06a9\u0648 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u06cc\u0646\u06af\u0648 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u0679\u06cc\u0633\u0679 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0627\u0633\u06d2 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u062c\u0627\u0632\u062a \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0645\u0642\u0627\u0645\u06cc \u06a9\u0646\u0679\u06cc\u0646\u0631 \u0645\u06cc\u06ba \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u06cc\u06c1 \u0627\u062c\u0627\u0632\u062a\u06cc\u06ba \u062d\u0627\u0635\u0644 \u06c1\u0648\u06ba \u06af\u06cc\u060c \u0644\u06cc\u06a9\u0646 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u06a9\u0648 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0637\u0644\u0648\u0628\u06c1 PostgreSQL \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0627\u0646\u0686 \u067e\u0627\u0633\u0632 \u0645\u062a\u0648\u0642\u0639 \u06c1\u06cc\u06ba\u06d4 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0686\u0644\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u062b\u0627\u0644\u0648\u06ba \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-common-mistakes-and-next-steps\">\u0639\u0627\u0645 \u063a\u0644\u0637\u06cc\u0627\u06ba \u0627\u0648\u0631 \u0627\u06af\u0644\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a<\/h2>\n<p>\u0627\u0628\u060c \u06cc\u06c1 \u0645\u062b\u0627\u0644 \u0622\u067e \u06a9\u06d2 \u06a9\u0631\u06cc\u0688\u0679 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062c\u0628 \u0622\u067e \u0627\u0633\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06a9\u0686\u06be \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0633\u06d2 \u0645\u062d\u0631\u0648\u0645 \u0631\u06c1\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-read-the-account-inside-the-lock\">\u0644\u0627\u06a9 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0648\u062c\u0648\u062f \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 \u067e\u0691\u06be\u06cc\u06ba<\/h3>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u067e\u0646\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0686\u06cc\u0632 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0628\u0627\u0633\u06cc \u0628\u06cc\u0644\u0646\u0633 \u0631\u06c1 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u062d\u0641\u0648\u0638 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u0628\u0630\u0631\u06cc\u0639\u06c1: <code>select_for_update()<\/code> \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2.<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06cc \u0633\u0631\u0648\u0633\u0632 \u06cc\u0627 \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u06cc\u06ba\u06d4 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0641\u0646\u06a9\u0634\u0646 \u062e\u0648\u062f \u0633\u06d2 \u0646\u0626\u06d2 \u0644\u0627\u06a9\u0688 \u0631\u06cc\u0688 \u06a9\u0627 \u0686\u0627\u0631\u062c \u0644\u06d2 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-use-the-database-as-the-shared-point-of-coordination\">\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0634\u0646 \u067e\u0648\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u062c\u0645\u0639 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba \u0628\u0679\u0646 \u06a9\u0648 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u06a9\u0644\u06a9\u0633 \u06a9\u0645 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u067e\u06be\u0631 \u0628\u06be\u06cc \u062f\u0648\u0633\u0631\u06d2 \u0679\u06cc\u0628 \u06cc\u0627 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u0633\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0628\u06be\u06cc\u062c \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 Python \u062a\u06be\u0631\u06cc\u0688 \u0644\u0627\u06a9\u0646\u06af \u0635\u0631\u0641 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u0648\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u06cc \u0639\u0645\u0644 \u0645\u06cc\u06ba \u0644\u0627\u06a9 \u06a9\u0648 \u0634\u06cc\u0626\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062a\u0639\u062f\u062f \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0648\u0631\u06a9\u0631\u0632 \u0686\u0644\u0627\u062a\u06d2 \u0648\u0642\u062a\u060c \u06a9\u0631\u06cc\u0688\u0679 \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u0627\u0628 \u0628\u06be\u06cc \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0645\u0627\u0646\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u0648\u0627\u062d\u062f \u0645\u0635\u0646\u0641 \u06c1\u06d2\u060c \u0627\u0646\u062a\u0638\u0627\u0645\u06cc \u0627\u06cc\u0688\u062c\u0633\u0679\u0645\u0646\u0679 \u0633\u0645\u06cc\u062a \u062f\u06cc\u06af\u0631 \u0628\u06cc\u0644\u0646\u0633 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-consider-a-conditional-update-for-simpler-counters\">\u0622\u0633\u0627\u0646 \u06a9\u0627\u0624\u0646\u0679\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0634\u0631\u0648\u0637 \u0627\u067e \u0688\u06cc\u0679\u0633 \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0642\u0637\u0627\u0631 \u0628\u0646\u062f \u06a9\u0631\u0646\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4 \u0633\u0627\u062f\u06c1 \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u062c\u06cc\u0646\u06af\u0648 \u0627\u06cc\u06a9 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u067e \u0688\u06cc\u0679 \u0645\u06cc\u06ba \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u062d\u0627\u0644\u062a \u0627\u0648\u0631 \u06af\u06be\u0679\u0627\u0624 \u06a9\u0627 \u0628\u06be\u06cc \u0627\u0638\u06c1\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2: <code>F()<\/code> \u0627\u0638\u06c1\u0627\u0631<\/p>\n<p>\u062d\u0627\u0644\u0627\u062a \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u063a\u06cc\u0631 \u0645\u0634\u0631\u0648\u0637 \u06af\u06be\u0679\u0627\u0624 \u06a9\u0627\u0641\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u0644\u0627\u06af\u0648 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0627 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0628\u06be\u06cc \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u06a9\u0679\u0648\u062a\u06cc \u0627\u0648\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0648 \u0627\u06cc\u06a9 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u0691\u06be\u0646\u06d2\u060c \u0641\u06cc\u0635\u0644\u0648\u06ba \u0627\u0648\u0631 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0648 \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0645 \u0646\u06d2 \u06cc\u06c1\u0627\u06ba \u0648\u0627\u0636\u062d \u0644\u0627\u06a9\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06cc\u06c1 \u0633\u0645\u062c\u06be \u0644\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u0648 \u06a9\u0633 \u0686\u06cc\u0632 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u0622\u067e \u0645\u0634\u0631\u0648\u0637 \u0627\u067e \u0688\u06cc\u0679\u0633 \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-separate-concurrent-requests-from-retries\">\u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u06cc\u06ba \u0627\u0644\u06af \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u06c1\u0645\u0627\u0631\u06cc \u0645\u062b\u0627\u0644 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u062f\u0648 \u06af\u0630\u0627\u0631\u0634\u0627\u062a \u06a9\u0648 \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u067e\u0627\u0633 \u062f\u0648 \u06a9\u0631\u06cc\u0688\u0679 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u0648\u06ba \u067e\u0631 \u0645\u062e\u062a\u0644\u0641 \u062a\u0642\u0627\u0636\u06d2 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u067e \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0631\u06d2 \u06af\u06cc\u060c \u0644\u06cc\u06a9\u0646 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062c\u0648\u0627\u0628 \u0636\u0627\u0626\u0639 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0648\u06c1\u06cc \u0645\u0646\u0637\u0642\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0635\u0644 \u0646\u062a\u06cc\u062c\u06c1 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0627\u0636\u0627\u0641\u06cc \u0642\u06cc\u0645\u062a \u06a9\u06d2 \u0648\u0627\u067e\u0633 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 <strong>\u0628\u06d2 \u062d\u0633\u06cc<\/strong>: \u062f\u06c1\u0631\u0627\u0626\u06cc \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u06a9\u06d2 \u0627\u062b\u0631\u0627\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u0627\u06af\u0648 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1\u06d4 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0688\u06cc\u0632\u0627\u0626\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u06a9\u0644\u06cc\u062f\u060c \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0627\u0646\u0641\u0631\u0627\u062f\u06cc\u062a \u06a9\u06d2 \u0627\u0635\u0648\u0644\u060c \u0627\u0648\u0631 \u0630\u062e\u06cc\u0631\u06c1 \u0634\u062f\u06c1 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06a9\u06cc\u0644\u06d2 \u0628\u06cc\u0644\u0646\u0633 \u0644\u0627\u06a9\u0646\u06af \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u0627\u0631\u0627\u062f\u06d2 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-plan-for-provider-failures\">\u0633\u067e\u0644\u0627\u0626\u0631 \u06a9\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0646\u0635\u0648\u0628\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u0631\u0646\u0627<\/h3>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0622\u067e \u06a9\u06cc \u0628\u06a9\u0646\u06af \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06c1\u0648 \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u0622\u067e \u06a9\u0627 \u06a9\u0631\u06cc\u0688\u0679 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0628\u062d\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627\u06d4 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u067e\u0627\u0644\u06cc\u0633\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06cc \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u06cc\u0627 \u0627\u0633\u06d2 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u0648\u06a9\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u06a9\u0631\u06cc\u0688\u0679 \u0631\u06cc\u0632\u0631\u0648 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0644\u06cc\u06a9\u0646 \u06a9\u0627\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u0648\u06a9 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0627\u06cc\u06a9 \u0639\u0645\u0644\u06cc \u0646\u0641\u0627\u0630 \u0628\u06be\u06cc \u0628\u062d\u0627\u0644 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06a9\u06c1 <code>reserved<\/code> \u062a\u0627\u0631\u06cc\u062e \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0633 \u0633\u06d2 \u0628\u0627\u062e\u0628\u0631 \u0631\u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631\u0648\u06ba \u06cc\u0627 \u0628\u062d\u0627\u0644\u06cc \u06a9\u06d2 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648 \u0644\u0627\u06af\u0648 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0628 \u0622\u067e \u0645\u062b\u0627\u0644 \u06a9\u0648 \u0628\u0691\u06be\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0646 \u062e\u062f\u0634\u0627\u062a \u06a9\u0648 \u0645\u0631\u0626\u06cc \u0631\u06a9\u06be\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0632\u06cc\u0627\u062f\u06c1 \u062e\u0631\u0686 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0628\u0686\u0646\u0627 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u06cc\u0688\u0679 \u0633\u0633\u0679\u0645 \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-summary-and-next-steps\">\u062e\u0644\u0627\u0635\u06c1 \u0627\u0648\u0631 \u0627\u06af\u0644\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a<\/h2>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u06a9\u06d2 \u0622\u063a\u0627\u0632 \u067e\u0631\u060c \u062f\u0648\u0646\u0648\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u06c1\u0631 \u0627\u06cc\u06a9 \u067e\u0627\u0633 \u0628\u06cc\u0644\u0646\u0633 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba \u06af\u06cc \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06cc\u06d4 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u0646\u0627 \u0622\u0633\u0627\u0646 \u062a\u06be\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0628\u06cc\u0644\u0646\u0633 0 \u067e\u0631 \u062e\u062a\u0645 \u06c1\u0648\u0627\u06d4<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u067e\u0646\u06d2 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u06a9\u06d2 \u062a\u0627\u0644\u06d2 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627\u06d4 \u06c1\u0645 \u0646\u06d2 \u062c\u0646\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0628\u06be\u06cc \u0686\u06cc\u06a9 \u06a9\u06cc\u060c \u0679\u06cc\u0633\u0679 \u06a9\u06cc\u0627 \u062c\u0628 \u062f\u0648\u0646\u0648\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u0645\u06cc\u06ba \u06a9\u0627\u0641\u06cc \u06a9\u0631\u06cc\u0688\u0679\u0633 \u062a\u06be\u06d2\u060c \u0627\u0648\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0628\u0646\u0627\u0646\u06d2 \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u06ba \u0627\u0633\u06cc \u0637\u0631\u062d \u06a9\u06cc \u0641\u0639\u0627\u0644\u06cc\u062a \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u062a\u06d2 \u0648\u0642\u062a:<\/p>\n<ol>\n<li>\n<p>\u0627\u0639\u062f\u0627\u062f \u0648 \u0634\u0645\u0627\u0631 \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u06cc\u0633\u06d2 \u06a9\u06c1 1 \u06a9\u0631\u06cc\u0688\u0679 \u0641\u06cc \u06af\u06be\u0631\u0627\u0646\u06c1 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062c\u06c1\u0627\u06ba \u0639\u0644\u06cc\u062d\u062f\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0642\u062f\u0631 \u06a9\u0648 \u067e\u0691\u06be \u0627\u0648\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0641\u06cc\u0635\u0644\u0648\u06ba \u0627\u0648\u0631 \u0645\u062a\u0639\u0644\u0642\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0645\u06cc\u06ba \u0628\u06d2 \u06a9\u0627\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0627\u0648\u0631 \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06cc\u0633\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u06cc\u06c1\u06cc \u0627\u0633\u062a\u062f\u0644\u0627\u0644 \u0622\u067e \u06a9\u06d2 \u0622\u0646 \u0644\u0627\u0626\u0646 \u0627\u0633\u0679\u0648\u0631 \u0645\u06cc\u06ba \u0622\u062e\u0631\u06cc \u0644\u0645\u062d\u0627\u062a \u06a9\u06cc \u0627\u0634\u06cc\u0627\u0621 \u06cc\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0627\u0644\u0627\u0624\u0646\u0633\u0632 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062a\u0635\u062f\u06cc\u0642 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u0645\u0641\u06cc\u062f \u06c1\u06d2 \u062c\u0628 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631 \u0633\u06a9\u06d2\u06d4<\/p>\n<h2 id=\"heading-references\">\u062d\u0648\u0627\u0644\u06c1 \u062c\u0627\u062a<\/h2>\n<p>\u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u0648\u06ba \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u0632\u06cc\u062f \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c idempotent API \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u062d\u0641\u0648\u0638 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u06cc\u06ba \u0628\u0646\u0627\u0646\u0627 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06cc AI \u0627\u06cc\u067e \u0645\u06cc\u06ba \u06a9\u0627\u0641\u06cc \u06a9\u0631\u06cc\u0688\u0679 \u0628\u0627\u0642\u06cc \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0627\u06cc\u06a9 \u0628\u0631\u0627\u0624\u0632\u0631 \u0679\u06cc\u0628 \u0645\u06cc\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0645\u0639 \u06a9\u0631\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u067e\u06c1\u0644\u06cc \u0679\u06cc\u0628 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0679\u06cc\u0628 \u0645\u06cc\u06ba \u062f\u0648\u0633\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0645\u0639 \u06a9\u0631\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u067e \u062f\u0648\u0646\u0648\u06ba \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f\u060c [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-29198","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/29198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=29198"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/29198\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=29198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=29198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=29198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}