ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² β Π½Π° ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ Π² C# π§
ΠΠ±Π·ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΠΈΡΠΎΠ²Π°Π½ΠΈΡ C# ΠΈ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET
Project maintained by Dvurechensky-Docs
Hosted on GitHub Pages — Theme by mattgraham
π ΠΠ°ΠΊΠΈΠ΅ Π±ΡΠ²Π°ΡΡ ΡΡΠΎΠ²Π½ΠΈ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ?
β¨ ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
1οΈβ£ ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎΠ²Π½ΠΈ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Π²Π°ΠΆΠ½Ρ
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ACID:
- A β Atomicity (Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ)
- C β Consistency (ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ)
- I β Isolation (ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ)
- D β Durability (Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΡ)
Isolation ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π²ΠΈΠ΄Π½Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌ.
ΠΠ΅Π· ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ:
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π³ΡΡΠ·Π½ΡΠ΅ ΡΡΠ΅Π½ΠΈΡ (dirty read).
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π½Π΅ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌΡΠ΅ ΡΡΠ΅Π½ΠΈΡ (non-repeatable read).
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½Ρ ΡΠ°Π½ΡΠΎΠΌΠ½ΡΠ΅ ΡΡΠ΅Π½ΠΈΡ (phantom read).
2οΈβ£ ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠ°Π΅Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° |
ΠΡΠΈΠΌΠ΅Ρ |
ΠΠΏΠ°ΡΠ½ΠΎΡΡΡ |
Dirty read |
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ B ΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ A Π΅ΡΡ Π½Π΅ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π»Π° ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΎΡΠΊΠ°ΡΠΈΠ»Π° |
B ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π΅ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ |
Non-repeatable read |
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ B ΠΌΠ΅Π½ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ A |
Π§ΡΠ΅Π½ΠΈΡ A ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ β ΠΎΡΠΈΠ±ΠΊΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ |
Phantom read |
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ B Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ Π½ΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² Π²ΡΠ±ΠΎΡΠΊΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ A |
A Π²ΠΈΠ΄ΠΈΡ Β«ΡΠ°Π½ΡΠΎΠΌΠ½ΡΠ΅Β» ΡΡΡΠΎΠΊΠΈ ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΌ SELECT |
3οΈβ£ Π£ΡΠΎΠ²Π½ΠΈ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ (ANSI SQL Standard)
a) Read Uncommitted
- Π‘ΡΡΡ: ΡΠ°ΠΌΠ°Ρ ΡΠ»Π°Π±Π°Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π²ΠΈΠ΄ΠΈΡ Π½Π΅Π·Π°Π²Π΅ΡΡΡΠ½Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΡ
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ.
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ: Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ dirty read, non-repeatable read ΠΈ phantom read.
- ΠΡΠΈΠΌΠ΅Ρ:
using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
b) Read Committed (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² SQL Server)
- Π‘ΡΡΡ: ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π²ΠΈΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ: Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ non-repeatable read ΠΈ phantom read, Π½ΠΎ Π½Π΅Ρ dirty read.
-
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- SQL Server ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ (shared lock).
- ΠΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ Read Committed Snapshot Isolation β ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΠ΅ΡΠ΅Π· versioning.
- ΠΠ°Π²Π΅ΡΠ·Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡΠΌΠ°ΡΡ, ΡΡΠΎ Read Committed Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ β Π½Π΅Ρ.
c) Repeatable Read
- Π‘ΡΡΡ: ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°.
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ: Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ°Π½ΡΠΎΠΌΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ (Π½ΠΎΠ²ΡΠ΅ INSERT ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ).
-
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- SQL Server ΡΡΠ°Π²ΠΈΡ shared lock Π½Π° ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
- ΠΠ°Π²Π΅ΡΠ·Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡ, ΡΠΈΡΠΊ deadlock.
d) Serializable
- Π‘ΡΡΡ: ΡΠ°ΠΌΠ°Ρ ΡΡΡΠΎΠ³Π°Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ.
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ: ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅Ρ Π²ΡΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ: Π½Π΅Ρ dirty read, non-repeatable read, phantom read.
-
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ range-lock Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠ°Π½ΡΠΎΠΌΠ½ΡΡ
ΡΡΡΠΎΠΊ.
- ΠΠ°Π²Π΅ΡΠ·Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, Π²ΡΡΠΎΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ β ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠ΅.
e) Snapshot (SQL Server ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎ)
- Π‘ΡΡΡ: ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π²ΠΈΠ΄ΠΈΡ ΡΠ½ΠΈΠΌΠΎΠΊ Π΄Π°Π½Π½ΡΡ
Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π΅Ρ Π½Π°ΡΠ°Π»Π°.
- ΠΡΠΎΠ±Π»Π΅ΠΌΡ: Π½Π΅Ρ dirty read, Π½Π΅Ρ non-repeatable read, Π½Π΅Ρ ΡΠ°Π½ΡΠΎΠΌΠΎΠ².
-
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ versioning (tempdb Ρ
ΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ).
- Π₯ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΎΡΡΡΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ
ΡΡΠ΅Π½ΠΈΠΉ.
- ΠΠ°Π²Π΅ΡΠ·Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: Π²ΡΡΠΎΠΊΠ°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° tempdb ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
4οΈβ£ ΠΡΠ±ΠΎΡ ΡΡΠΎΠ²Π½Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ
Π£ΡΠΎΠ²Π΅Π½Ρ |
Dirty Read |
Non-repeatable Read |
Phantom Read |
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ |
Read Uncommitted |
β
|
β
|
β
|
Π²ΡΡΠΎΠΊΠ°Ρ |
Read Committed |
β |
β
|
β
|
ΡΡΠ΅Π΄Π½ΡΡ |
Repeatable Read |
β |
β |
β
|
Π½ΠΈΠΆΠ΅ |
Serializable |
β |
β |
β |
Π½ΠΈΠ·ΠΊΠ°Ρ |
Snapshot |
β |
β |
β |
Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ versioning |
ΠΠ°Π²Π΅ΡΠ·Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: Β«ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅Β» ΡΡΠΎΠ²Π½Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ β Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΡΡΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΠ°Π΄Π°Π΅Ρ, deadlock ΡΠΈΡΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ.
5οΈβ£ ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΎΠ²Π΅ΡΡ Π΄Π»Ρ .NET
- ΠΠ»Ρ Web API / ΠΎΡΡΡΡΠ½ΠΎΡΡΠΈ: ΡΠ°ΡΡΠΎ Ρ
Π²Π°ΡΠ°Π΅Ρ
Read Committed
ΠΈΠ»ΠΈ Snapshot
Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ.
- ΠΠ»Ρ Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΡ
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ:
Serializable
ΠΈΠ»ΠΈ Repeatable Read
β ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ.
- ΠΠ»Ρ ΠΌΠ°ΡΡΠΎΠ²ΡΡ
ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ: ΠΈΠ·Π±Π΅Π³Π°ΡΡ Serializable β ΡΠΈΡΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
- EF Core ΠΏΡΠΈΠΌΠ΅ΡΡ:
using var transaction = await context.Database.BeginTransactionAsync(System.Data.IsolationLevel.RepeatableRead);
- Deadlock prevention: ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π΅Π΄ΠΈΠ½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°Ρ
Π²Π°ΡΠ° ΡΠ΅ΡΡΡΡΠΎΠ².
β¬ ΠΠ΅ΡΠ½ΡΡΡΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ
β¨Dvurechenskyβ¨