|
Блокировка РС 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 выставлять?
Если да то как обойти стандартные блокировки только на чтение чтобы они работали нормально, мне нужно так делать только для чтения и записи |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |