You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/theory/data_blocking.md
+67-15Lines changed: 67 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,14 +10,47 @@ title: Блокировки
10
10
#### Что такое блокировка?
11
11
**Блокировка данных** — механизм, обеспечивающий конкурентный доступ пользователей к информационной базе и целостность данных при одновременных изменениях. Она предотвращает конфликты, когда несколько пользователей пытаются изменить одни и те же данные.
12
12
13
+
**Простой аналог:**
14
+
Продавец блокирует яблоко для покупателя, пока тот отсчитывает деньги. Другие покупатели не могут выбрать это яблоко до завершения операции.
15
+
13
16
#### Проблемы, которые решают блокировки:
14
17
1.**Потерянное изменение** — когда изменения одной транзакции перезаписываются другой
ОтменитьТранзакциюА() // Работа с некорректным значением
32
+
```
33
+
16
34
3. **Неповторяемое чтение** — разные результаты при повторном чтении тех же данных
35
+
36
+
```bsl
37
+
// Транзакция A: // Транзакция B:
38
+
Сумма = Прочитать() // =1000 // Параллельно:
39
+
Изменить(1000 → 2000)
40
+
Сумма = Прочитать() // =2000!
41
+
```
42
+
17
43
4. **Чтение фантомов** — появление новых данных между чтениями (актуально для необъектных сущностей, например, регистры сведений и накопления)
18
44
19
-
#### Простой аналог:
20
-
Продавец блокирует яблоко для покупателя, пока тот отсчитывает деньги. Другие покупатели не могут выбрать это яблоко до завершения операции.
45
+
```bsl
46
+
// Транзакция A (регистр сведений, упрощенный пример):
47
+
ВсегоЗаписей = КоличествоЗаписей() // =100
48
+
49
+
// Транзакция Б добавляет новую запись
50
+
ДобавитьЗаписьВРегистр()
51
+
52
+
ВсегоЗаписей = КоличествоЗаписей() // =101!
53
+
```
21
54
22
55
## Типы блокировок в 1С
23
56
@@ -95,7 +128,7 @@ title: Блокировки
95
128
|**Фантомы**| ✅ Возможно | ✅ Возможно | ✅ Возможно | ❌ Запрещено |
96
129
|**Параллельность**| Высокая | Средняя | Низкая | Очень низкая |
97
130
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.
99
132
100
133
#### Сравнение Read Committed vs Read Committed Snapshot
101
134
@@ -252,15 +285,6 @@ title: Блокировки
252
285
253
286
**Решение**: Делите большие операции на пакеты (по 1000-2000 записей).
254
287
255
-
#### Рекомендации по оптимизации
256
-
1. ✅ Перейти на **управляемый режим** блокировок
257
-
2. ✅ Включить **RCSI (Read Committed Snapshot)** для MS SQL
258
-
3. ✅ Включить **разделитель итогов** для регистров без контроля остатков
259
-
4. ✅ Использовать **Запрос** вместо `НаборЗаписей.Прочитать()` для чтения
260
-
5. ✅ Делать **транзакции короткими**
261
-
6. ✅ Использовать **многопоточность** для массовых операций
## Механизмы контроля остатков в типовых конфигурациях
265
289
266
290
#### Два механизма контроля остатков
@@ -290,14 +314,42 @@ title: Блокировки
290
314
**Симптом**: Две транзакции ждут друг друга.
291
315
292
316
**Причины**:
317
+
- Недостаточный уровень изоляции
318
+
319
+
Транзакции считывают данные под разделяемой блокировкой (S), а затем пытаются обновить их, что требует установки монопольной блокировки (X).
320
+
321
+
Если две транзакции одновременно удерживают S-блокировки на одних и тех же ресурсах и запрашивают X-блокировки для их изменения, возникает взаимоблокировка.
322
+
293
323
- Неоптимальный порядок блокировок
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
+
294
347
- Длительные транзакции
295
-
- Отсутствие индексов
296
348
297
349
**Решение**:
350
+
- Блокировка в транзакции должна изначально осуществляться с максимально необходимым уровнем
0 commit comments