Skip to content

Commit 43afffb

Browse files
committed
Новые страницы теории
1 parent e7a7b87 commit 43afffb

18 files changed

Lines changed: 701 additions & 56 deletions

docs/theory/data_blocking.md

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,47 @@ title: Блокировки
1010
#### Что такое блокировка?
1111
**Блокировка данных** — механизм, обеспечивающий конкурентный доступ пользователей к информационной базе и целостность данных при одновременных изменениях. Она предотвращает конфликты, когда несколько пользователей пытаются изменить одни и те же данные.
1212

13+
**Простой аналог:**
14+
Продавец блокирует яблоко для покупателя, пока тот отсчитывает деньги. Другие покупатели не могут выбрать это яблоко до завершения операции.
15+
1316
#### Проблемы, которые решают блокировки:
1417
1. **Потерянное изменение** — когда изменения одной транзакции перезаписываются другой
18+
19+
```bsl
20+
// Транзакция A: // Транзакция B:
21+
Остаток = 100 Остаток = 100
22+
Остаток = Остаток - 10 = 90 Остаток = Остаток - 20 = 80
23+
Записать(90) Записать(80) // Затерло 90!
24+
```
25+
1526
2. **"Грязное" чтение** — чтение незафиксированных данных
27+
28+
```bsl
29+
// Транзакция A: // Транзакция B параллельно:
30+
ИзменитьСумму(1000 → 2000) Сумма = ПрочитатьСумму() // =2000!
31+
ОтменитьТранзакциюА() // Работа с некорректным значением
32+
```
33+
1634
3. **Неповторяемое чтение** — разные результаты при повторном чтении тех же данных
35+
36+
```bsl
37+
// Транзакция A: // Транзакция B:
38+
Сумма = Прочитать() // =1000 // Параллельно:
39+
Изменить(1000 → 2000)
40+
Сумма = Прочитать() // =2000!
41+
```
42+
1743
4. **Чтение фантомов** — появление новых данных между чтениями (актуально для необъектных сущностей, например, регистры сведений и накопления)
1844
19-
#### Простой аналог:
20-
Продавец блокирует яблоко для покупателя, пока тот отсчитывает деньги. Другие покупатели не могут выбрать это яблоко до завершения операции.
45+
```bsl
46+
// Транзакция A (регистр сведений, упрощенный пример):
47+
ВсегоЗаписей = КоличествоЗаписей() // =100
48+
49+
// Транзакция Б добавляет новую запись
50+
ДобавитьЗаписьВРегистр()
51+
52+
ВсегоЗаписей = КоличествоЗаписей() // =101!
53+
```
2154
2255
## Типы блокировок в 1С
2356
@@ -95,7 +128,7 @@ title: Блокировки
95128
| **Фантомы** | ✅ Возможно | ✅ Возможно | ✅ Возможно | ❌ Запрещено |
96129
| **Параллельность** | Высокая | Средняя | Низкая | Очень низкая |
97130

98-
**Read Committed Snapshot (RCSI)**: Режим версионирования, поддерживается в PostgreSQL, Oracle и MS SQL (с 8.3). Нет ожиданий на блокировках при чтении т.к если другая транзакция пишет данные, ваш запрос не ждет, а читает "старый снимок" данных, которые были до начала записи. **Рекомендуется включать** для MS SQL в управляемом режиме.
131+
**Read Committed Snapshot (RCSI)**: Режим версионирования, поддерживается в PostgreSQL, Oracle и MS SQL (с 8.3). Нет ожиданий на блокировках при чтении т.к если другая транзакция пишет данные, ваш запрос не ждет, а читает "старый снимок" данных, которые были до начала записи. **Рекомендуется включать** для 8.2 или 8.3 в режиме совместимости с 8.2.
99132

100133
#### Сравнение Read Committed vs Read Committed Snapshot
101134

@@ -252,15 +285,6 @@ title: Блокировки
252285
253286
**Решение**: Делите большие операции на пакеты (по 1000-2000 записей).
254287
255-
#### Рекомендации по оптимизации
256-
1. ✅ Перейти на **управляемый режим** блокировок
257-
2. ✅ Включить **RCSI (Read Committed Snapshot)** для MS SQL
258-
3. ✅ Включить **разделитель итогов** для регистров без контроля остатков
259-
4. ✅ Использовать **Запрос** вместо `НаборЗаписей.Прочитать()` для чтения
260-
5. ✅ Делать **транзакции короткими**
261-
6. ✅ Использовать **многопоточность** для массовых операций
262-
7. ✅ **Мониторить** блокировки специальными инструментами
263-
264288
## Механизмы контроля остатков в типовых конфигурациях
265289
266290
#### Два механизма контроля остатков
@@ -290,14 +314,42 @@ title: Блокировки
290314
**Симптом**: Две транзакции ждут друг друга.
291315

292316
**Причины**:
317+
- Недостаточный уровень изоляции
318+
319+
Транзакции считывают данные под разделяемой блокировкой (S), а затем пытаются обновить их, что требует установки монопольной блокировки (X).
320+
321+
Если две транзакции одновременно удерживают S-блокировки на одних и тех же ресурсах и запрашивают X-блокировки для их изменения, возникает взаимоблокировка.
322+
293323
- Неоптимальный порядок блокировок
324+
325+
Пример: Два документа — «Поступление товаров» и «Реализация товаров» — при проведении обращаются к одним и тем же виртуальным таблицам регистров, но порядок вызова методов записи различен:
326+
327+
```bsl
328+
// Поступление товаров
329+
// 1. 🔒 Сначала блокируются ОстаткиНаСкладах
330+
ОстаткиНаСкладах.Записать();
331+
332+
// 2. Потом пробуем блокировать ОстаткиОрганизаций, но уже заблокировано реализацией, ожидаем...
333+
ОстаткиОрганизаций.Записать();
334+
```
335+
336+
```bsl
337+
// Реализация товаров
338+
// 1. 🔒 Сначала блокируются ОстаткиОрганизаций
339+
ОстаткиОрганизаций.Записать();
340+
341+
// 2. Потом пробуем блокировать ОстаткиНаСкладах, но уже заблокировано поступлением, ожидаем...
342+
ОстаткиНаСкладах.Записать();
343+
```
344+
345+
При параллельном проведении таких документов высока вероятность взаимоблокировки, так как каждая транзакция удерживает блокировку на одном ресурсе и ожидает освобождения другого.
346+
294347
- Длительные транзакции
295-
- Отсутствие индексов
296348
297349
**Решение**:
350+
- Блокировка в транзакции должна изначально осуществляться с максимально необходимым уровнем
298351
- Устанавливать блокировки в одинаковом порядке
299352
- Делать транзакции короткими
300-
- Использовать правильные индексы
301353
302354
#### Ожидания на блокировках
303355
@@ -368,7 +420,7 @@ title: Блокировки
368420
369421
* [Ответственное чтение данных](https://its.1c.ru/db/v8std#content:648:hdoc)
370422
371-
* [Блокировка данных объекта для редактирования из кода](https://its.1c.ru/db/v8std/content/490/hdoc)
423+
* [Блокировка данных объекта для редактирования из кода](https://its.1c.ru/db/v8std/content/490/hdoc)
372424
373425
* [Ускорение в 100 раз. Решаем проблему блокировок](https://infostart.ru/1c/articles/629017/)
374426

0 commit comments

Comments
 (0)