Имя: Пароль:
1C
1С v8
Управляемые блокировки, грязное чтение
0 mxs089
 
28.10.15
11:06
РС Цены, колонки - Номенклатура, Цена, регистр периодический.
Блокировка управляемая.

Открываю транзакцию, пишу новую цену и запросом читаю данные, после отменяю транзакцию, запросом получаю новую цену...

Файловый вариант. Как читать зафиксированную цену?
1 DmitrO
 
28.10.15
11:12
не всякий вызов ОтменитьТранзакцию() приводит к ее отмене )
2 DmitrO
 
28.10.15
11:12
как и, не всякий вызов начать транзакцию приводит к ее началу )
3 mistеr
 
28.10.15
11:13
Может еще где транзакция открывается?
4 Гёдза
 
28.10.15
11:13
ну это не вложенная транзакция, иначе повторное чтение вызвало бы ошибку
5 Тoлько_
Просмотр
 
28.10.15
11:13
(0) Сумбур какой-то. Где транзакцию открываешь? Только не говори что в обработке проведения документа, которым устанавливаешь цены.
6 Господин ПЖ
 
28.10.15
11:22
эм... а в файловой "грязное чтение" вообще возможно?
7 scanduta
 
28.10.15
11:25
Что бы читать зафиксированную цену  , нужно читать в транзакции
8 H A D G E H O G s
 
28.10.15
11:30
Автор, вы не имеете среди знакомых Павленского Пётра, а то нам ваш перформанс непонятен.
9 ptiz
 
28.10.15
11:33
(0) "и запросом читаю данные" - в другом сеансе или этом же?
10 mxs089
 
29.10.15
10:53
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);

Блокировка = Новый БлокировкаДанных;
    
Элемент = Блокировка.Добавить("РегистрСведений.Цены");
Элемент.УстановитьЗначение("Номенклатура", Номенклатура);
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
    
Блокировка.Заблокировать();
    
Менеджер = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
Менеджер.Период = Дата;
Менеджер.Номенклатура = Номенклатура;
Менеджер.Цена = Цена;
Менеджер.Записать(Истина);
    
Ресурсы = РегистрыСведений.Цены.ПолучитьПоследнее(, Новый Структура("Номенклатура", Номенклатура));
    
Сообщить(Ресурсы.Цена);
    
ОтменитьТранзакцию();
11 mxs089
 
29.10.15
11:23
запускаю два сеанса под разными пользователями, под одним запускаю обработку, которая меняет цены, под вторым в это время происходит чтение цены, мне вылазит старая цена, хотя после завершения обработки ценник может измениться, как произвести блокировку таблицы, чтобы остальные пользователи не могли получить старый ценник?
12 rozer76
 
29.10.15
11:23
(10) если чтение в том же сеансе то получаете "новую" цену также для изучения можно это посмотреть http://its.1c.ru/db/metod8dev/content/2733/hdoc/_top/%F2%F0%E0%ED%E7%E0%EA%F6%E8%E8

Теперь если в др. сеансе: уже на "Блокировка.Заблокировать();" повиснет др. сеанс а как только транзакция кончиться - прочитает "старую" цену.
Если бы явной блокировки вообще не было - файловый вариант в отличии от клиент-серверного не читает не зафиксированные данные т.е. вкл. версионирование. А для клиент сервера или использовать чтение в транзакции или вкл. версионирование в СУБД.

http://its.1c.ru/db/metod8dev/content/2604/hdoc/_top/%F2%F0%E0%ED%E7%E0%EA%F6%E8%E8
13 1sanekmaloi1
 
29.10.15
11:29
(11)Читающий цену код показывай, транзакцией похоже там и не пахнет.
14 mxs089
 
29.10.15
11:35
Запись новой цены

НачатьТранзакцию();
    
Менеджер = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
Менеджер.Период = Дата;
Менеджер.Номенклатура = Номенклатура;
Менеджер.Цена = Цена;
Менеджер.Записать(Истина);
    
Дата = ТекущаяДата();
КонецДата = ТекущаяДата() + 60;
Пока Дата < КонецДата Цикл
    Дата = ТекущаяДата();
КонецЦикла;
    
ОтменитьТранзакцию();

Чтение 2 пользователь

Ресурсы = РегистрыСведений.Цены.ПолучитьПоследнее(, Новый Структура("Номенклатура", Номенклатура));
    
Сообщить(Ресурсы.Цена);
15 H A D G E H O G s
 
29.10.15
11:39
(14) 2 пользователь пусть читает в транзакции
16 rozer76
 
29.10.15
11:58
(15) вроде как для файловой ИБ необязательно - см. 12
17 rozer76
 
29.10.15
12:00
(16) + хотя, попробуй... фиг знает какая 1сплатформа ну до кучи можно попробовать и блокировку попробовать и в записи и в чтении... интересно на каком варианте у него заработает... хотя и не логично
19 mxs089
 
29.10.15
13:17
(18) следи за базаром
20 ptiz
 
29.10.15
13:37
(14) И что не так?
Тут ты указал, что 2ой пользователь читает после команды "ОтменитьТранзакцию".
Т.е. восстановлено то, что было до записи набора.