PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: "เจฎเจฐเฉ‡" เจฆเฉ€ เจญเฉ€เฉœ เจจเจพเจฒ เจฒเฉœเจจเจพ

PostgreSQL เจฆเฉ‡ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจฎเจ•เฉˆเจจเจฟเจœเจผเจฎ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจ•เฉเจ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจคเฉ‡เจœเจผ เจนเฉ‹เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจ…เจคเฉ‡ เจฆเฉ‚เจœเจฟเจ†เจ‚ เจตเจฟเฉฑเจš "เจฌเจนเฉเจค เจคเฉ‡เจœเจผ เจจเจนเฉ€เจ‚"เฅค เจ…เฉฑเจœ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• DBMS เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจ•เฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจ‡เฉฑเจ• เจŸเจ•เจฐเจพเจ… เจฆเฉ€ เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจ‰เจฆเจพเจนเจฐเจฃ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจค เจ•เจฐเจพเจ‚เจ—เฉ‡ - เจ…เฉฑเจชเจกเฉ‡เจŸ เจฌเจจเจพเจฎ MVCC เจธเจฟเจงเจพเจ‚เจค.

เจคเฉ‹เจ‚ เจธเฉฐเจ–เฉ‡เจช เจ•เจนเจพเจฃเฉ€ เจฎเจนเจพเจจ เจฒเฉ‡เจ–:

เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจ•เจคเจพเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฎเจพเจ‚เจก เจฆเฉเจ†เจฐเจพ เจธเฉฐเจธเจผเฉ‹เจงเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจธเจฒ เจตเจฟเฉฑเจš เจฆเฉ‹ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ: DELETE เจ…เจคเฉ‡ INSERT. IN เจธเจคเจฐ เจฆเจพ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ xmax เจจเฉ‚เฉฐ เจ‰เจธ เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจœเจฟเจธเจจเฉ‡ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจซเจฟเจฐ เจ‡เจธ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจธเฉฐเจธเจ•เจฐเจฃ เจ‡เฉฑเจ•เฉ‹ เจฒเจพเจˆเจจ; เจ‡เจธเจฆเจพ xmin เจฎเฉเฉฑเจฒ เจชเจฟเจ›เจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ xmax เจฎเฉเฉฑเจฒ เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจฆเฉ‡ เจชเฉ‚เจฐเจพ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจ•เฉเจ เจธเจฎเฉ‡เจ‚ เจฌเจพเจ…เจฆ, เจชเฉเจฐเจพเจฃเจพ เจœเจพเจ‚ เจจเจตเจพเจ‚ เจธเฉฐเจธเจ•เจฐเจฃ, เจ‡เจธ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ COMMIT/ROOLBACK, เจจเฉ‚เฉฐ เจฎเจพเจจเจคเจพ เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€ "เจฎเฉเจฐเจฆเจพ" (เจฎเฉเจฐเจฟเจค เจŸเฉ‚เจชเจฒเจธ) เจฒเฉฐเจ˜เจฃ เจตเฉ‡เจฒเฉ‡ VACUUM เจธเจพเจฐเจฃเฉ€ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจ…เจคเฉ‡ เจธเจพเจซเจผ.

PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: "เจฎเจฐเฉ‡" เจฆเฉ€ เจญเฉ€เฉœ เจจเจพเจฒ เจฒเฉœเจจเจพ

เจชเจฐ เจ‡เจน เจคเฉเจฐเฉฐเจค เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจชเจฐ "เจฎเฉเจฐเจฆเฉ‡" เจจเจพเจฒ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฌเจนเฉเจค เจœเจฒเจฆเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ - เจตเจพเจฐ-เจตเจพเจฐ เจœเจพเจ‚ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเจพ เจชเฉเฉฐเจœ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ‡เฉฑเจ• เจตเฉฑเจกเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš, เจ…เจคเฉ‡ เจฅเฉ‹เฉœเฉเจนเฉ€ เจฆเฉ‡เจฐ เจฌเจพเจ…เจฆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจธเฉ‡ เจธเจฅเจฟเจคเฉ€ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐเจจเจพ เจชเจตเฉ‡เจ—เจพ VACUUM เจฎเจฆเจฆ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ.

#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: เจตเจฐเจคเฉ‹ IS DISTINCT FROM, เจฒเฉ‚เจ•!

เจ‡เจธ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจ…เจœเฉ‡ เจตเฉ€ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจธเฉ€ เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจธเจพเจฐเฉ‡, เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจœเจพเจ‚ เจ•เจจเจตเจฐเจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉŒเจฐเจพเจจ)เฅค เจ…เจคเฉ‡ เจ…เจœเจฟเจนเจพ เจ•เฉเจ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจ‰เฉฑเจกเจฆเจพ เจนเฉˆ:

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;

เจญเจพเจตเฉ‡เจ‚ เจ‡เจน เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจคเฉ‹เจ‚ เจธเฉเจคเฉฐเจคเจฐ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจชเจฐ เจ‰เจธเฉ‡ ID เจฆเฉ‡ เจ…เฉฐเจฆเจฐ, เจฆเฉ‚เจœเจพ เจ•เจฒเจพเจ‡เฉฐเจŸ เจ‡เจธ เจฌเฉ‡เจจเจคเฉ€ 'เจคเฉ‡ "เจฒเจพเจ•" เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจชเจนเจฟเจฒเจพ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจชเฉ‚เจฐเจพ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเจพเฅค

เจนเฉฑเจฒ #1: เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจชเจฟเจ›เจฒเฉ‡ เจ‡เฉฑเจ• เจคเฉฑเจ• เจ˜เจŸเจพ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ

เจšเจฒเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚ IS DISTINCT FROM:

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

เจ‡เจธ เจซเจพเจฐเจฎ เจตเจฟเฉฑเจš, เจฆเฉ‚เจœเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ•เฉเจ เจตเฉ€ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเฉ‡เจ—เฉ€, เจธเจญ เจ•เฉเจ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เจน เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ - เจ‡เจธเจฒเจˆ, เจฌเจฒเจพเจ•เจฟเฉฐเจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เฉ€. เจ…เฉฑเจ—เฉ‡, เจ…เจธเฉ€เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ‡ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจตเจฟเฉฑเจš เจฐเจฟเจ•เจพเจฐเจก เจจเฉ‚เฉฐ "เจจเจนเฉ€เจ‚ เจฒเฉฑเจญเจฃ" เจฆเฉ‡ เจคเฉฑเจฅ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจนเฉฑเจฒ #2: เจธเจฒเจพเจนเจ•เจพเจฐเฉ€ เจคเจพเจฒเฉ‡

เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจฒเฉ‡เจ– เจฒเจˆ เจ‡เฉฑเจ• เจตเฉฑเจกเจพ เจตเจฟเจธเจผเจพ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจคเฉเจธเฉ€เจ‚ เจชเฉœเฉเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจ…เจคเฉ‡ เจธเจฟเจซเจพเจฐเจธเจผเฉ€ เจฌเจฒเจพเจ•เจฟเฉฐเจ— เจฆเฉ‡ "เจฐเฉ‡เจ•".

เจนเฉฑเจฒ #3: เจฎเฉ‚เจฐเจ– เจ•เจพเจฒเจพเจ‚

เจชเจฐ เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ‰เจนเฉ€ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจกเฉ‡ เจจเจพเจฒ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ‡เฉฑเจ•เฉ‹ เจฐเจฟเจ•เจพเจฐเจก เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจฆเจพ เจ•เฉฐเจฎ? เจœเจพเจ‚ เจ•เฉ€ เจคเฉเจธเฉ€เจ‚ เจ•เจฒเจพเจ‡เฉฐเจŸ เจธเจพเจˆเจก 'เจคเฉ‡ เจ•เจพเจฐเฉ‹เจฌเจพเจฐเฉ€ เจคเจฐเจ• เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจจเจพเจฒ เจ—เฉœเจฌเฉœ เจ•เฉ€เจคเฉ€, เจ‰เจฆเจพเจนเจฐเจฃ เจฒเจˆ? เจ…เจคเฉ‡ เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเฉ‹เจšเจฆเฉ‡ เจนเฉ‹? ..

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹