Read Committed Π² PostgreSQL: ΠΊΠ°ΠΊΠΈΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ ΠΎΡΡΠ°ΡΡΡΡ ΠΈ ΡΠ΅ΠΌ ΠΈΡ Π·Π°ΠΊΡΡΠ²Π°ΡΡ?
Π PostgreSQL ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β Read Committed, ΠΈ ΠΎΠ½ Π΄Π°ΡΡ ΠΌΠ΅Π½ΡΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΠΉ, ΡΠ΅ΠΌ ΡΠ°ΡΡΠΎ Π΄ΡΠΌΠ°ΡΡ: ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΠΈΠ΄ΠΈΡ ΡΠ²ΠΎΠΉ ΡΠ½ΠΈΠΌΠΎΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π²Π° SELECT Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π²Π΅ΡΠ½ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π° ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Β«ΠΏΡΠΎΡΠΈΡΠ°Π» ΠΎΡΡΠ°ΡΠΎΠΊ β ΠΏΠΎΡΡΠΈΡΠ°Π» β Π·Π°ΠΏΠΈΡΠ°Π»Β» ΡΠ΅ΡΡΠ΅Ρ ΡΡΠΆΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅. ΠΡΡΠ·Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ Π½Π΅Ρ, Π½ΠΎ ΠΏΠΎΡΠ΅ΡΡΠ½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ write skew Π΅ΡΡΡ. ΠΠ°ΠΊΡΡΠ²Π°ΡΡ ΠΈΡ
ΡΡΠ΅ΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ. ΠΡΠΎΠΌΠ°ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ Π±Π΅Π· ΡΡΠ΅Π½ΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: UPDATE ... SET balance = balance - 100 WHERE id = 1 AND balance >= 100 β ΡΠ°ΠΌΠ° Π‘Π£ΠΠ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΏΠΎΠ΄ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ. Π―Π²Π½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° SELECT ... FOR UPDATE, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΡΠΈΡΠ°ΡΡ Π² SQL Π½Π΅Π»ΡΠ·Ρ. Repeatable Read ΠΈΠ»ΠΈ Serializable, ΠΊΠΎΠ³Π΄Π° Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ: PostgreSQL ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΡ
ΡΠ΅ΡΠ΅Π· ΡΠ½ΠΈΠΌΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π΅ ΠΆΠ΄ΡΡ, Π° ΠΏΠ°Π΄Π°Π΅Ρ Ρ 40001 β ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°Π½ΠΎ ΡΠΌΠ΅ΡΡ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π΅Ρ.