Имя: Пароль:
1C
1С v8
Вопрос по БлокироватьДляИзменения
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 как раз в режиме версионирования. Как-то я провтыкал этот момент.
Ошибка? Это не ошибка, это системная функция.