PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เดฎเดฐเดฟเดšเตเดšเดตเดฐเตเดŸเต†" เด•เต‚เดŸเตเดŸเดคเตเดคเดฟเดจเต†เดคเดฟเดฐเดพเดฏ เดชเต‹เดฐเดพเดŸเตเดŸเด‚

PostgreSQL-เดจเตเดฑเต† เด†เดจเตเดคเดฐเดฟเด• เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดคเตเดฏเต‡เด•เดคเด•เตพ เดšเดฟเดฒ เดธเดพเดนเดšเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เด…เดคเต เดตเดณเดฐเต† เดตเต‡เด—เดคเตเดคเดฟเดฒเดพเด•เดพเดจเตเด‚ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฏเดฟเตฝ "เดตเดณเดฐเต† เดตเต‡เด—เดคเตเดคเดฟเดฒเดพเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเดจเตเด‚" เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดกเดฟเดฌเดฟเดŽเด‚เดŽเดธเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดกเต†เดตเดฒเดชเตเดชเตผ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดตเตˆเดฐเตเดฆเตเดงเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดฎเดฟเด•เดšเตเดš เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ เด‡เดจเตเดจเต เดจเดฎเตเดฎเตพ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเด‚ - เด…เดชเตเดกเต‡เดฑเตเดฑเต vs MVCC เดคเดคเตเดตเด™เตเด™เตพ.

เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดนเตเดฐเดธเตเดต เด•เดฅ เดตเดฒเดฟเดฏ เดฒเต‡เด–เดจเด‚:

เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดตเดฐเดฟ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฐเดฃเตเดŸเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดจเดŸเดคเตเดคเตเดจเตเดจเต: เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•, เดšเต‡เตผเด•เตเด•เตเด•. IN เดธเตเดŸเตเดฐเดฟเด‚เด—เดฟเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเต xmax เดŽเดจเตเดจเดคเต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดจเดŸเดคเตเดคเดฟเดฏ เด‡เดŸเดชเดพเดŸเดฟเดจเตเดฑเต† เดŽเดฃเตเดฃเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต. เด…เดชเตเดชเต‹เตพ เด…เดคเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต เด’เดฐเต‡ เดตเดฐเดฟ; เด…เดคเดฟเดจเตเดฑเต† xmin เดฎเต‚เดฒเตเดฏเด‚ เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† xmax เดฎเต‚เดฒเตเดฏเดตเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เดˆ เด‡เดŸเดชเดพเดŸเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ เด•เตเดฑเดšเตเดšเต เดธเดฎเดฏเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดชเดดเดฏเดคเต‹ เดชเตเดคเดฟเดฏเดคเต‹ เด†เดฏ เดชเดคเดฟเดชเตเดชเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต COMMIT/ROOLBACK, เด…เด‚เด—เต€เด•เดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚ "เดšเดคเตเดค" (เดšเดคเตเดค เดŸเตเดฏเต‚เดชเตเดชเดฟเตพเดธเต) เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดฎเตเดชเต‹เตพ VACUUM เดฎเต‡เดถ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟ.

PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เดฎเดฐเดฟเดšเตเดšเดตเดฐเตเดŸเต†" เด•เต‚เดŸเตเดŸเดคเตเดคเดฟเดจเต†เดคเดฟเดฐเดพเดฏ เดชเต‹เดฐเดพเดŸเตเดŸเด‚

เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เด‰เดŸเดจเดŸเดฟ เดธเด‚เดญเดตเดฟเด•เตเด•เดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ โ€œเดฎเดฐเดฟเดšเตเดšเดตเดฐเตเดฎเดพเดฏเตเดณเตเดณโ€ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดตเดณเดฐเต† เดตเต‡เด—เดคเตเดคเดฟเตฝ เดจเต‡เดŸเดพเดจเดพเด•เตเด‚ - เด†เดตเตผเดคเตเดคเดฟเดšเตเดšเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเตเดŸเต† เด•เต‚เดŸเตเดŸ เด…เดชเตเดกเต‡เดฑเตเดฑเต เด’เดฐเต เดตเดฒเดฟเดฏ เดฎเต‡เดถเดฏเดฟเตฝ, เด•เตเดฑเดšเตเดšเต เด•เดดเดฟเดžเตเดžเต เดจเดฟเด™เตเด™เตพ เด…เดคเต‡ เดธเดพเดนเดšเดฐเตเดฏเด‚ เดจเต‡เดฐเดฟเดŸเต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚ VACUM-เดจเต เดธเดนเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

#1: เดžเดพเตป เด‡เดคเต เดจเต€เด•เตเด•เดพเตป เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเต

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฐเต€เดคเดฟ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เตเด•เดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เดจเตเดจเต เดชเดฑเดฏเดŸเตเดŸเต†, เดšเดฟเดฒ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเดฟเตฝ X เดซเต€เตฝเดกเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต เด…เดคเตเดฏเดพเดตเดถเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดชเต†เดŸเตเดŸเต†เดจเตเดจเต เด…เดคเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต:

UPDATE tbl SET X = <newX> WHERE pk = $1;

เดคเตเดŸเตผเดจเตเดจเต, เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เดชเตเดฐเต‹เด—เดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, Y เดซเต€เตฝเดกเตเด‚ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเต:

UPDATE tbl SET Y = <newY> WHERE pk = $1;

... เดชเดฟเดจเตเดจเต† Z - เดŽเดจเตเดคเดฟเดจเดพเดฃเต เดจเดฟเดธเตเดธเดพเดฐเด•เดพเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เดธเดฎเดฏเด‚ เด•เดณเดฏเตเดจเตเดจเดคเต?

UPDATE tbl SET Z = <newZ> WHERE pk = $1;

เดˆ เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเดจเตเดฑเต† เดŽเดคเตเดฐ เดชเดคเดฟเดชเตเดชเตเด•เตพ เดจเดฎเตเด•เตเด•เต เด‡เดชเตเดชเต‹เตพ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เด‰เดฃเตเดŸเต? เด…เดคเต†, 4 เด•เดทเดฃเด™เตเด™เตพ! เด‡เดตเดฏเดฟเตฝ เด’เดฐเต†เดฃเตเดฃเด‚ เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† 3 เดŽเดฃเตเดฃเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดถเต‡เดทเด‚ [เด“เดŸเตเดŸเต‹]เดตเดพเด•เตเดตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เด‡เดคเต เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดšเต†เดฏเตเดฏเดฐเตเดคเต! เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด• เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ เดŽเดฒเตเดฒเดพ เดซเต€เตฝเดกเตเด•เดณเตเด‚ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต - เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพเดฏเตโ€Œเดชเตเดชเต‹เดดเตเด‚ เดฐเต€เดคเดฟเดฏเตเดŸเต† เดฏเตเด•เตเดคเดฟ เด‡เดคเตเดชเต‹เดฒเต† เดฎเดพเดฑเตเดฑเดพเดตเตเดจเตเดจเดคเดพเดฃเต:

UPDATE tbl SET X = <newX>, Y = <newY>, Z = <newZ> WHERE pk = $1;

#2: เด‰เดชเดฏเต‹เด—เด‚ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฃเต, เดฒเต‚เด•เตเด•เดพ!

เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เด†เด—เตเดฐเดนเดฟเดšเตเดšเต เด’เดฐเต เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด• (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด’เดฐเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เตบเดตเต†เตผเดŸเตเดŸเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ). เด‡เดคเตเดชเต‹เดฒเตเดณเตเดณ เด’เดจเตเดจเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเดฑเด•เตเด•เตเดจเตเดจเต:

UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2;

เดเด•เดฆเต‡เดถเด‚ เดˆ เดซเต‹เดฎเดฟเดฒเต† เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เดพเดฑเตเดฃเตเดŸเต, เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพเดฏเตโ€Œเดชเตเดชเต‹เดดเตเด‚ เด’เดฐเต เดถเต‚เดจเตเดฏเดฎเดพเดฏ เดชเตเดคเดฟเดฏ เดซเต€เตฝเดกเต เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดกเดพเดฑเตเดฑเดฏเดฟเดฒเต† เดšเดฟเดฒ เดชเดฟเดถเด•เตเด•เตพ เดคเดฟเดฐเตเดคเตเดคเดพเดจเดพเดฃเต. เด…เดคเต‡ เดธเดฎเดฏเด‚ เด…เดตเตพ เดคเดจเตเดจเต† เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด•เตƒเดคเตเดฏเดค เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ - เดชเด•เตเดทเต‡ เดตเต†เดฑเตเดคเต†! เด…เดคเดพเดฏเดคเต, เดฑเต†เด•เตเด•เต‹เตผเดกเต เดคเดฟเดฐเตเดคเตเดคเดฟเดฏเต†เดดเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด…เดคเดฟเตฝ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚ - เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต? เดจเดฎเตเด•เตเด•เต เด…เดคเต เดถเดฐเดฟเดฏเดพเด•เตเด•เดพเด‚:

UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2 AND X IS DISTINCT FROM <newX>;

เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด…เดคเตเดญเตเดคเด•เดฐเดฎเดพเดฏ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฑเตเดŸเต† เด…เดธเตเดคเดฟเดคเตเดตเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดชเดฒเตผเด•เตเด•เตเด‚ เด…เดฑเดฟเดฏเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เด‡เดคเดพ เด’เดฐเต เดšเต€เดฑเตเดฑเต เดทเต€เดฑเตเดฑเต IS DISTINCT FROM เดธเดนเดพเดฏเดฟเด•เตเด•เดพเตป เดฎเดฑเตเดฑเต เดฒเต‹เดœเดฟเด•เตเด•เตฝ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผเดฎเดพเดฐเตเด‚:
PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เดฎเดฐเดฟเดšเตเดšเดตเดฐเตเดŸเต†" เด•เต‚เดŸเตเดŸเดคเตเดคเดฟเดจเต†เดคเดฟเดฐเดพเดฏ เดชเต‹เดฐเดพเดŸเตเดŸเด‚
... เด•เต‚เดŸเดพเดคเต† เดธเดฎเตเดšเตเดšเดฏเดคเตเดคเดฟเดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เตเดฑเดšเตเดšเต ROW()-เดญเดพเดตเด™เตเด™เตพ:
PostgreSQL เด†เดจเตเดฑเดฟเดชเดพเดฑเตเดฑเต‡เดฃเตเด•เตพ: "เดฎเดฐเดฟเดšเตเดšเดตเดฐเตเดŸเต†" เด•เต‚เดŸเตเดŸเดคเตเดคเดฟเดจเต†เดคเดฟเดฐเดพเดฏ เดชเต‹เดฐเดพเดŸเตเดŸเด‚

#3: เดคเดŸเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดžเดพเตป เดŽเดจเตเดฑเต† เดชเตเดฐเดฃเดฏเดฟเดจเดฟเดฏเต† เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตเดจเตเดจเต

เดฒเต‹เดžเตเดšเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต เดธเดฎเดพเดจเดฎเดพเดฏ เดฐเดฃเตเดŸเต เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ, เด“เดฐเต‹เดจเตเดจเตเด‚ เดŽเตปเดŸเตเดฐเดฟ "เดชเตเดฐเต‹เด—เดคเดฟเดฏเดฟเดฒเดพเดฃเต†เดจเตเดจเต" เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต:

UPDATE tbl SET processing = TRUE WHERE pk = $1;

เดˆ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดชเดฐเดธเตเดชเดฐเด‚ เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดฏเดฟ เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เด’เดฐเต‡ เดเดกเดฟเดฏเดฟเตฝ เดคเดจเตเดจเต†, เด†เดฆเตเดฏ เด‡เดŸเดชเดพเดŸเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเดจเตเดจเดคเตเดตเดฐเต† เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เด•เตเดฒเดฏเดจเตเดฑเต เดˆ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ "เดฒเต‹เด•เตเด•เต" เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚.

เดชเดฐเดฟเดนเดพเดฐเด‚ # 1: เดšเตเดฎเดคเดฒ เดฎเตเดฎเตเดชเดคเตเดคเต‡เดคเดฟเดฒเต‡เด•เตเด•เต เดšเตเดฐเตเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดจเดฎเตเด•เตเด•เต เด…เดคเต เดตเต€เดฃเตเดŸเตเด‚ เดšเต‡เตผเด•เตเด•เดพเด‚ IS DISTINCT FROM:

UPDATE tbl SET processing = TRUE WHERE pk = $1 AND processing IS DISTINCT FROM TRUE;

เดˆ เดซเต‹เดฎเดฟเตฝ, เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เด’เดจเตเดจเตเด‚ เดฎเดพเดฑเตเดฑเดฟเดฒเตเดฒ, เดŽเดฒเตเดฒเดพเด‚ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เด†เดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ - เด…เดคเดฟเดจเดพเตฝ, เดคเดŸเดฏเตฝ เดธเด‚เดญเดตเดฟเด•เตเด•เดฟเดฒเตเดฒ. เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดชเตเดฐเดฏเต‹เด—เดฟเดšเตเดš เด…เตฝเด—เต‹เดฐเดฟเดคเดคเตเดคเดฟเตฝ เดฑเต†เด•เตเด•เต‹เตผเดกเต "เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดฟเดฒเตเดฒ" เดŽเดจเตเดจ เดตเดธเตเดคเตเดค เดžเด™เตเด™เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดชเดฐเดฟเดนเดพเดฐเด‚ # 2: เด‰เดชเดฆเต‡เดถเด• เดฒเต‹เด•เตเด•เตเด•เตพ

เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เด’เดฐเต เดตเดฒเดฟเดฏ เดตเดฟเดทเดฏเด‚, เด…เดคเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ เดชเตเดฐเดฏเต‹เด—เดคเตเดคเดฟเดจเตเดฑเต† เดฐเต€เดคเดฟเด•เดณเตเด‚ เดถเตเดชเดพเตผเดถ เดคเดŸเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ "เดฑเต‡เด•เตเด•เต".

เดชเดฐเดฟเดนเดพเดฐเด‚ # 3: เดฎเดฃเตเดŸเตป เด•เต‹เดณเตเด•เตพ

เดŽเดจเตเดจเดพเตฝ เด‡เดคเตเดคเดจเตเดจเต†เดฏเดพเดฃเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเด‚เดญเดตเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด’เดฐเต‡ เดฑเต†เด•เตเด•เต‹เตผเดกเตเดณเตเดณ เด’เดฐเต‡เดธเดฎเดฏเด‚ เดœเต‹เดฒเดฟ? เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เตเดฒเดฏเดจเตเดฑเต เดญเดพเด—เดคเตเดคเต เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เตเด•เต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เดจเดฟเด™เตเด™เตพ เด•เตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹? เดชเดฟเดจเตเดจเต† เด†เดฒเต‹เดšเดฟเดšเตเดšเดพเตฝ?..

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•