|
Вопрос по БлокироватьДляИзменения | ☑ | ||
---|---|---|---|---|
0
Alex_MA
14.04.14
✎
12:09
|
Здравствуйте!
Есть Транзакция №1, которая записала данные в регистр. Дальше после записи в регистр Транзакцией №1 и до момента чтения остатков из регистра Транзакцией №1 случилась Транзакция № 2, которая изменила итоги в регистре, но еще не зафиксировала данные. Вопрос: Почему на момент времени чтения остатков Транзакцией №1 будут получены данные с учетом не зафиксированной Транзакции №2 - Ведь это ГРЯЗНОЕ ЧТЕНИЕ. А ведь в управляемом режиме блокировками уровень изоляции ReadCommiting, который исключает грязное чтение!!! Или в данном случае (когда включен режим разделения итогов) - это является исключением и тут возможно грязное чтение ? Спасибо за внимание. |
|||
1
fisher
14.04.14
✎
12:21
|
Где-то ты накосячил. БлокироватьДляИзменения отключает разделитель итогов до конца транзакции. Т.е. Транзакция №2 не могла изменить итоги в регистре.
|
|||
2
rozer76
14.04.14
✎
12:21
|
боже.. опять ... http://infostart.ru/public/196565
|
|||
3
Alex_MA
14.04.14
✎
12:30
|
(1)Я хочу понять, если не отключать разделение итогов. Что будет. Грязное чтение ?
(2)это я уже прочитал Меня интересует только один вопрос. Чтобы избежать грязного чтения ? Как описано в руководстве разработчика: Чтобы избежать изменения итогов между моментом записи и моментом чтения остатков, еще до формирования и записи движений регистра свойство набора записей БлокироватьДляИзменения устанавливается в значение Истина. Ведь по сути это грязное чтение - чтение не зафиксированных данных Транзакцией №2. |
|||
4
fisher
14.04.14
✎
12:36
|
Да не, вроде не должно быть такой фигни и без БлокироватьДляИзменения... БД какая?
|
|||
5
floody
14.04.14
✎
12:42
|
(3) (4) если установили "блокироватьдляизменения", не запишет вторая транзакция ничего, ибо будет ждать окончания транзакции №1
|
|||
6
floody
14.04.14
✎
12:45
|
(4) если "блокироватьдляизменения" не указано, блокировка будет снята сразу по окончании записи движений в регистр, и до момента чтения возможно изменение итогов другой транзакцией, следовательно и будут прочитаны неверные "грязные" итоги
|
|||
7
Alex_MA
14.04.14
✎
12:46
|
(4)MS SQL Server 2005.
Но выходит что так, есть место для грязного чтения из таблицы итогов рег. накопления, при условии что мы не установили БлокироватьДляИзменения = Истина (5)с этим и так ясно |
|||
8
Alex_MA
14.04.14
✎
12:47
|
(6)Все теперь ясно. Значить в данном случае грязное чтение имеет место быть
|
|||
9
fisher
14.04.14
✎
12:49
|
Не-не-не! Что ясно? Вторая транзакция еще не зафиксирована. MSSQL при READ COMMITED не должен был дать первой транзакции прочитать данные без учета разделителя, т.к. часть данных в этот момент залочены второй транзакцией.
|
|||
10
fisher
14.04.14
✎
12:51
|
(0) А как именно ты читаешь? Запросом?
|
|||
11
rozer76
14.04.14
✎
13:04
|
(8) нет, блокировка накладывается с момента записи набора регистров и до окончания транзакции а если отсутствует "БлокироватьДляИзменения" то в (2) описано к чему это приведет. Конечно надо обсуждать конкретный код.
|
|||
12
Alex_MA
14.04.14
✎
13:19
|
Мне не понятен вот этот абзац из http://infostart.ru/public/196565
Если используется версионник В этом случае, заблокированные строки первой транзакции, никак не помешают 2-й транзакции прочитать остатки (т.к. в версионнике пишущие не блокируют читающих). Вторая транзакция спокойно прочитает старую версию данных (версию на момент начала первой транзакции) и спишет остаток в минус. Что бы этого не допустить нужна управляемая блокировка на уровне 1С. Если поставить БлокироватьДляИзменения = Истина, мы как раз получим такую блокировку, и данные будут заблокированы на уровне платформы. Что такое версионник ? >>т.к. в версионнике пишущие не блокируют читающих => Т.е. данные будут прочитаны только по разделителю Транзакции №1 без учета внесенных изменений Транзакцией № 2? |
|||
13
rozer76
14.04.14
✎
13:48
|
||||
14
fisher
14.04.14
✎
13:50
|
Версионирование и блокировки - два подхода для разрешения коллизий параллельных транзакций в СУБД. MSSQL - блокировочная СУБД, но в последних версиях можно использовать и версионирование. PostgreSQL - версионник.
|
|||
15
Alex_MA
14.04.14
✎
14:00
|
(14)точно. Спасибо
|
|||
16
fisher
14.04.14
✎
14:01
|
Гы. А в 8.3 1С юзает MSSQL как раз в режиме версионирования. Как-то я провтыкал этот момент.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |