Skip to content
7 / 15

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 β€” ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ обязано ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π΅Ρ‘.

Read Committed Π² PostgreSQL: ΠΊΠ°ΠΊΠΈΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΈ Ρ‡Π΅ΠΌ ΠΈΡ… Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚? | JScriptiser