|
Блокировки в 1С | ☑ | ||
---|---|---|---|---|
0
Septera
03.04.20
✎
11:15
|
Управляемые блокировки, надо заблокировать регистр накопления для чтения, в ОбработкаПроведения документа пишу:
Блокировка = Новый БлокировкаДанных;
Останавливаюсь в конфигураторе, открываю в новом окне 1С, выполняю запрос на выборку из регистра и о чудо он выбирает?! Что блин происходит кто-нибудь может мне объяснить? |
|||
1
polosov
03.04.20
✎
11:27
|
(0) Попробуй
Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); |
|||
2
Septera
03.04.20
✎
11:33
|
(1) тоже самое
|
|||
3
ptiz
03.04.20
✎
11:40
|
(0) "выполняю запрос на выборку из регистра " - в транзакции?
|
|||
4
Septera
03.04.20
✎
11:41
|
(3) нет, просто запрос Оо, а что в транзакции надо чтобы увидеть блокировку?
|
|||
5
ptiz
03.04.20
✎
11:45
|
(4) ага
|
|||
6
fisher
03.04.20
✎
11:49
|
(0) Ты управляемые блокировки с автоматическими не попутал? Управляемые блокировки только сами себя блокируют. Запросам на них плевать.
|
|||
7
fisher
03.04.20
✎
11:58
|
На пальцах - автоматические блокировки полностью опирались на блокировки СУБД. Но в отсутствие гибкого управления со стороны прога приходилось стрелять из пушки по воробьям (использовать максимальный уровень изоляции транзакций с плачевным результатом для параллельности).
Поэтому решили так - уровень изоляции транзакций СУБД опустить до минимально разумного, а дальше пускай прог рулит управляемыми блокировками. СУБД вообще ни сном ни духом про управляемые блокировки. Их сервер приложений контролирует. |
|||
8
Septera
03.04.20
✎
12:00
|
(5) спасибо комрад!
(6) я попутал когда решил что блокировки в 1С работают по такому же принципу как в MySQL, когда там ставишь блокировку уровня SERIALIZABLE то разницы нету в транзакции или нет делает кто-то запрос, блокировка стоит и все тут |
|||
9
Septera
03.04.20
✎
12:03
|
(7) "СУБД вообще ни сном ни духом про управляемые блокировки. Их сервер приложений контролирует." - вот это $#ять больше всего парит в 1С, кто сказал что так лучше, хз... сами так придумали и решили пусть будет так, а весь остальной мир живет по своим правилам
|
|||
10
mistеr
03.04.20
✎
12:04
|
(0) В сеансе чтения тоже нужно заблокировать.
|
|||
11
mistеr
03.04.20
✎
12:05
|
(9) Книжки читай, тогда будешь знать, кто придумал и зачем.
|
|||
12
fisher
03.04.20
✎
12:07
|
(9) Ты не шаришь. В автоматических блокировках как раз и жили в SERIALIZABLE и жили очень хреново. И 1С тут не изобретатели. Я уже встречал подобные решения. И это отличный компромисс, я тебе скажу.
|
|||
13
Cyberhawk
03.04.20
✎
12:10
|
(4) В 8.3 запретить другим читать вне транзакции никак не можешь
|
|||
14
Septera
03.04.20
✎
12:11
|
(9) по каждому языку свою книжку про особенности работы с базой или может не$%й изобретать свои идиотские принципы программирования? почему мне не приходится программирую на php переучиваться работе с транзакциями в java или python?
|
|||
15
Septera
03.04.20
✎
12:18
|
(12) да причем здесь автоматические или управляемые, просто привел пример в виде SERIALIZABLE для моей задачи он сейчас требуется и никто не говорит что всегда нужен, я его вообще редко использовал в СУБД потому что с блокировками надо аккуратнее, все просто может повиснуть, кроме SERIALIZABLE есть еще READ UNCOMMITTED, READ COMMTITED, REPEATABLE READ и все это вместе дает необходимый ресурс для разработчика чтобы решить проблемы с параллельным чтением/записью, просто кто-то решил что надо сделать все "по-своему"
|
|||
16
Cyberhawk
03.04.20
✎
12:24
|
(14) "кроме SERIALIZABLE есть еще READ UNCOMMITTED, READ COMMTITED, REPEATABLE READ и все это вместе дает необходимый ресурс для разработчика чтобы решить проблемы с параллельным чтением/записью" // Не дает
|
|||
17
timeforlive
03.04.20
✎
12:27
|
КОД:
// Создание объекта блокировка Блокировка = Новый БлокировкаДанных; // Добавление элемента блокировки Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); // Установка режима блокировки Элемент.Режим = РежимБлокировкиДанных.Исключительный; // Установка полей блокировки Элемент.УстановитьЗначение("Склад", Склад); Элемент.ИсточникДанных = СписокНоменклатуры; Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); //Блокировка данных Блокировка.Заблокировать(); Источник: курсы-по-1с Из темы 11: Какие навыки в использовании управляемых блокировок потребуются на экзамене |
|||
18
mistеr
03.04.20
✎
12:28
|
(14) Потому что ты еще не сталкивался по-настоящему с проблемами конкурентного доступа к БД.
И оставь свое раздражение при себе, тут не курилка, чтобы выговориться. |
|||
19
mistеr
03.04.20
✎
12:30
|
(15) Поставь автоматические блокировки, сделать "ВЫБРАТЬ ... ДЛЯ ИЗМЕНЕНИЯ" и будет тебе (почти) serializable.
|
|||
20
fisher
03.04.20
✎
12:31
|
(14) Ты ж не путай божий дар с яичницей. В других языках ты можешь контролировать все тонкости взаимодействия твоей программы с СУБД. И ты БЛЯДЬ БУДЕШЬ контролировать все тонкости. Каждый запрос ты должен понимать когда посылать и как посылать. Иначе твоя программа будет обычным говнокодом, неспособным к высокопроизводительной параллельной работе без потери целостности состояний. А 1С пытается максимально снять этот гемор с програ, чтобы каждая домохозяйка смогла писать рабочий код, не углубляясь в дебри. Не забывай, что кучу запросов 1С генерит неявно. 1С пытается максимально все упростить без большой потери гибкости. И я считаю, что у них отлично получилось. Ты просто не распробовал вкус устриц а уже брызжешь слюной потому что где-то не так как ты привык.
|
|||
21
Septera
03.04.20
✎
12:40
|
(20) вооо, зришь в корень, значит надо нанять стадо домохозяек и научить их кодить, платить зп продуктами, а самому жить на Бали)
|
|||
22
fisher
03.04.20
✎
12:54
|
(21) А ты думал, куда попал? Одинэсники эти самые домохозяины и есть :) Только жаднее, чем ты думаешь :)
|
|||
23
dmpl
03.04.20
✎
13:38
|
(21) Управляемые блокировки - это еще бОльшая гибкость. Хочешь - изолируешь. Не хочешь - не изолируешь. Запусти оба своих запроса на чтение в транзакции. После блокировки данных одним из запросов - фиг ты прочитаешь, пока не снимешь блокировку. Но если все-таки надо прочитать - запускаешь запрос вне транзакции и читаешь.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |