|
17.01.2011, 14:13 | #1 |
Участник
|
Как в 1С работают транзакционные блокировки
Меня часто спрашивают о принципах транзакционных блокировок в 1С.
Вот краткая шпаргалка. Справедливо для клиент-серверных версий 1С 8.х 1. Вне транзакций (в т.ч. отчеты) - "грязное чтение" (Read Uncommited). Теоретически можно вызвать транзакцию внутри отчета и перевести режим доступа в Repeatable Read, но тогда начинает работать п.2 и на все читаемые данные накладывается разделяемая блокировка. 2. Транзакция в автоматическом режиме блокировок (1С 8.0) - по умолчанию Repeatable Read или Serializable на уровне записей, блокируются все отбираемые записи всех таблиц, считываемые в процессе транзакции. Если нужно наложить исключительную (неразделяемую) блокировку - программист должен в запросе к данным использовать конструкцию ДЛЯ ИЗМЕНЕНИЯ с перечислением блокируемых таблиц. Исключительная блокировка также возникает в момент записи движений документа (в конце транзакции проведения, если в коде нет явных конструкций типа X++: ..(); 3. Управляемый режим блокировок (введен с версии 8.1, но программист может использовать и автоматический режим) - по умолчанию в рамках транзакции везде Read Commited на уровне записей, Если нужно использовать разделяемую (по чтению) или исключительную блокировку, программист самостоятельно должен определить таблицы и записи, на которые накладывается блокировка. X++: Dl=New DataLock; Element1= Dl.Add("РегистрНакопления.ОстаткиНаСкладе"); // элементов блокировки м.б. много Element1.Mode=DataLockMode.Exclusive; Element1.SetValue("Склад", ); // фильтр по складу Element1.DataSource= QueryResult; // например, результат запроса, но м.б. и табличная часть, и временная таблица. Element1.UseFromDataSource("Товар","Номенклатура"); // фильтруем измерение Товар по колонке результата запроса Номенклатура Dl.Lock(); Последний раз редактировалось Сисой; 17.01.2011 в 14:19. |
|
|
За это сообщение автора поблагодарили: ziva (2), kosenkov (1). |
18.01.2011, 11:49 | #2 |
Участник
|
1.
Цитата:
2. Транзакция в автоматическом режиме блокировок (1С 8.0) - по умолчанию Repeatable Read или Serializable на уровне записей, блокируются все отбираемые записи всех таблиц, считываемые в процессе транзакции.
2. Цитата:
Если нужно использовать разделяемую (по чтению) или исключительную блокировку, программист самостоятельно должен определить таблицы и записи, на которые накладывается блокировка.
|
|
18.01.2011, 13:57 | #3 |
Участник
|
1. Возможна эскалация. Надо отметить, что в DB2 и PostgreSQL еще хуже. В DB2 всегда Serializable (записи), а в PostgreSQL - Read Commited на уровне таблиц. Как в Oracle - не знаю.
2. Да, указываются объекты метаданных. Для ускорения записи в регистры 1С использует разделение итогов (включается опционально для каждого регистра), т.е. если две транзакции одновременно пишут в регистр остатков по измерению "Кабель ПВХ-10" записи -5 и -3, а текущий остаток на складе равен 8, то в таблице остатков появятся следующие записи: 0; Кабель ПВХ 10; 3 1; Кабель ПВХ 10; -3 где первое значение - номер сессии параллельной записи. (Упаковка выполняется регламентным заданием.) |
|
11.04.2011, 11:29 | #4 |
Участник
|
Кстати вот хороший материал по блокировкам Анализ блокировок
|
|
15.12.2014, 09:49 | #5 |
Модератор
|
SEO оптимизаторов тут банят
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
|