ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ вопросов ❓ Π½Π° собСсСдовании Π² C# 🍧

ΠžΠ±Π·ΠΎΡ€ вопросов ΠΏΠΎ языка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ C# ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

πŸ”’ КакиС Π±Ρ‹Π²Π°ΡŽΡ‚ ΡƒΡ€ΠΎΠ²Π½ΠΈ изоляции Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹?

Typing SVG

Static Badge

✨ ОглавлСниС

⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ


1️⃣ ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΠΈ изоляции Π²Π°ΠΆΠ½Ρ‹

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ACID:

Isolation опрСдСляСт, ΠΊΠ°ΠΊ измСнСния ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²ΠΈΠ΄Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ транзакциям.

Π‘Π΅Π· ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ изоляции:


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

using var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);

b) Read Committed (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² SQL Server)


c) Repeatable Read


d) Serializable


e) Snapshot (SQL Server спСцифично)


4️⃣ Π’Ρ‹Π±ΠΎΡ€ уровня изоляции

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ Dirty Read Non-repeatable Read Phantom Read ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
Read Uncommitted βœ… βœ… βœ… высокая
Read Committed ❌ βœ… βœ… срСдняя
Repeatable Read ❌ ❌ βœ… Π½ΠΈΠΆΠ΅
Serializable ❌ ❌ ❌ низкая
Snapshot ❌ ❌ ❌ зависит ΠΎΡ‚ versioning

ΠšΠ°Π²Π΅Ρ€Π·Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: Β«ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅Β» уровня изоляции β†’ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ растут, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Π΄Π°Π΅Ρ‚, deadlock риск увСличиваСтся.


5️⃣ ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ совСты для .NET

  1. Для Web API / отчётности: часто Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Read Committed ΠΈΠ»ΠΈ Snapshot для быстрого чтСния.
  2. Для банковских Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ: Serializable ΠΈΠ»ΠΈ Repeatable Read β†’ ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ.
  3. Для массовых ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ: ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Serializable β†’ риск Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.
  4. EF Core ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
using var transaction = await context.Database.BeginTransactionAsync(System.Data.IsolationLevel.RepeatableRead);
  1. Deadlock prevention: ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π΅Π΄ΠΈΠ½Ρ‹ΠΉ порядок Π·Π°Ρ…Π²Π°Ρ‚Π° рСсурсов.

⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ

✨Dvurechensky✨