Имя: Пароль:
1C
1С v8
Блокировка РС 8.3
,
0 alexei366
 
02.10.13
16:23
Мужики подскажите ка по быстрому.
Я как понял если я создам набор записей РС и по какомунибудь отбору прочитаю его, то все записи блокируются на изменения, но доступны для чтения (или только из запроса?). Все это конечно завернуто в автоматическую транзакцию.
Я прав или нет?
(P.S. с блокировками не работал до этого, а тут надо блокировать 1 запись регистра при выполнении фонового задания от других сеансов, но дать возможность считывать ещё не измененные данные этой записи)
1 alexei366
 
02.10.13
16:45
Ладно, буду сам тестить раз так.
2 alexei366
 
02.10.13
17:54
Считывать дает, записывать нет - но при этом не вылетает с ошибкой а ждет пока первый сеанс освободит и изменяет данные во втором сеансе блин
3 Fragster
 
модератор
02.10.13
18:05
(2) все правильно. а если ты еще считаешь в первой транзакции, потом попытаешься во второй записать, а потом в первой записать - получишь дедлок
4 alexei366
 
02.10.13
18:13
(3) Впринципе да согласен,
Надо замутить мне просто: есть одна запись регистра, она завязана на некую область действий, действия могут быть активными или фиктивными. Смысл в том что одновременно запретить выполнять активные действия, то есть если запись занята другим сеансом то выдавать ошибку для текущего который пытается выполнить активное действие.
5 alexei366
 
02.10.13
18:16
(4) То есть запретить даже попытку начать выполнять активное действие (изменения данных связано с различными объектами базы, а мне не нужно чтобы первый сеанс изменил общие данные, второй сеанс запустился через секунду и тоже изменил общие данные, а в конце второй сеанс ждет пока первый освободит зафиксирует транзакцию и сохранит данные, и перезаписывает своими, которые вычеслял получается ещё не на обновленных данных)
6 alexei366
 
02.10.13
18:17
(3) Мне походу какимнить объектом чтоли пользоваться типа справочника чтобы установить блокировку а в конце снять её?
7 Fragster
 
модератор
02.10.13
18:19
в автоматической транзакции достаточно указать ДЛЯ ИЗМЕННИЯ в запросе
8 bolobol
 
02.10.13
18:21
Вот, кстати! ДЛЯ ИЗМЕНЕНИЯ - нужно ли выбирать блокируемую таблицу или достаточно того, что выборка выбрала, то эти лишь записи и будут заблокированы? А если выбрать таблицу - заблокируется вся?
9 alexei366
 
02.10.13
18:36
Возьмем простой пример.
Есть у нас РС с измерением Строка и реквизитом Число.
В первом сеансе я начинаю транзакцию считываю запись где строка = "а" и инкрементирую значения числа на 3 если оно равно < 5 (представим что изначально в записи число равнялось 3), а если >=5 то увеличиваем на 5;
Во втором сеансе происходит тоже самое, только для первого условия инкремент на 4 а для второго 6.

Сейчас как я понимаю что при одновременном запуске 2-х сеансов (ну пусть первый был запущен на бесконечно малый момент времени) в них выполниться одинаковые условия, то есть в итоге мы получим перезапись и число станет равным 7, а необходимо чтобы получилось 12
10 alexei366
 
02.10.13
18:38
(9) А точнее чтобы второй сеанс вылетел по ошибки "мол занято ща, пробуй позже". Ну это уже можно будет обыграть, самое главное чтобы была возможность понять занята или нет запись регистра.
11 Fragster
 
модератор
02.10.13
18:39
(9) навтыкай предупреждений в код и попробуй - пользы будет больше, чем если все просто написать
12 alexei366
 
02.10.13
18:39
(11) Какие предупреждения ты имеешь ввиду?
13 bolobol
 
02.10.13
18:43
(12) Предупреждений, типа:
- Не стоит писать в этот регистр!
- Алексей, регистр этот проклят, не произведи чтения с него!
Ну и в таком духе.
14 Fragster
 
модератор
02.10.13
18:50
(12) которые выскакивают в окно, останавливая выполнение кода
15 alexei366
 
02.10.13
19:00
(14) Открою секрет, это у меня выполняется в веб-сервисе
16 Fragster
 
модератор
02.10.13
19:02
(15) открою секрет - если код выполняется в веб сервере - то его можно выполнить и во внешней обработке
17 alexei366
 
02.10.13
19:14
(16) Методы вызываться будут исключительно из веб-сервиса, обработка не вариант
18 Новиков
 
02.10.13
20:09
1. Какой режим управления блокировкой данных стоит в конфе?
2. Какой режим управления блокировкой стоит на РС?
19 Fragster
 
модератор
02.10.13
20:27
(17) тебе для экспериментов/отдадки пригодится. а там - предупреждение уберешь - и все
20 Fragster
 
модератор
02.10.13
20:28
ну и да - управляемые блокировки заруливают неуправляемые
21 alexei366
 
02.10.13
20:39
(18) Да все по умолчанию в управляемом
22 alexei366
 
02.10.13
20:40
(19) Бли я тя не так понял, не нужны мне эти предупреждения, я сразу в серверных процедурах тестю имитируя задержку в первом сеансе чтобы запустить второй (на 15 сек)
23 Новиков
 
02.10.13
20:47
(21) если все в управляемом, то в начале транзакции тебе нужно установить исключительную блокировку на эту запись. Этого будет достаточно.
24 Зойч
 
02.10.13
20:50
а зачем вообще происходит блокировка регистра сведений, особенно если он подчинен регистратору?
25 alexei366
 
02.10.13
21:09
(24) он не подчинен
26 alexei366
 
02.10.13
21:10
(24) чот не получается

Ссылка = Справочники.Справочник_Блокировка.Основной;

    
    
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("Справочник.Справочник_Блокировка");
    
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Ссылка");
    Стр = Таблица.Добавить();
    Стр.Ссылка = Ссылка;
    
    ЭлементБлокировки.ИсточникДанных = Таблица;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Ссылка");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    
    Блокировка.Заблокировать();
27 Новиков
 
02.10.13
21:31
ЭлементБлокировки = Блокировка.Добавить("Справочник.Справочник_Блокировка");

??? Вроде разговор шел о РС. Причем тут СПРАВОЧНИК?
28 alexei366
 
03.10.13
02:14
(27) Да я эксперементирую просто
29 Новиков
 
03.10.13
09:47
(28) тогда понятно почему не получается. Как надоест экспериментировать, вернись к (23) и сделай так, как написано там. Удачи :)
30 alexei366
 
03.10.13
11:10
(29) Да я не так выразился, там то все блокируется, но почему то не блокируется на чтение, в чем траблы?
31 alexei366
 
03.10.13
12:54
(30) Блин чот у меня Регистр сведений блокируется в любом случае (чтобы не выставлял) при заварачивании в транзакцию (хотя везде указываю управляемый и програмно не блокирую запись).
32 Новиков
 
03.10.13
16:30
(31) чтобы тебе помочь, нужен четко сформулированный вопрос, описанный по такому алгоритму:
1. Текст исходной задачи
2. Твой программный код
3. Сам вопрос

Сейчас вряд ли кто-то, из оставшихся здесь, понял твой поток сознания. Особенно в свете того, что ты пишешь "указываю управляемый". Ты сам писал в (21) "все по умолчанию в управляемом". Что ты еще указываешь? Зачем?
33 alexei366
 
03.10.13
21:01
(32) Корочь режим управляемый. Надо заблокировать запись регистра сведений из одного сеанса и на чтение и на запись для других сеансов, а в других сеансах или чтоб по исключению вылетал при попытке чтения, или чтоб можно было понять что запись заблокированна.
34 Fragster
 
модератор
03.10.13
21:35
(33) установи время захвата ожидания блокировки в 0
35 alexei366
 
03.10.13
21:45
(34) ты мен прости, но эо где в SQL выставлять?
Если да то как обойти стандартные блокировки только на чтение чтобы они работали нормально, мне нужно так делать только для чтения и записи
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.