Имя: Пароль:
1C
 
Почему происходит конфликт блокировок при такой схеме?
0 toypaul
 
гуру
21.02.18
16:01
НачатьТранзакцию

Запрос.Выполнить("Тут запрос по регистру, по которому конфликт")

ДокОб.Записать(Проведени) //вот тут конфликт

ЗафиксироватьТранзакию

или такая схема

НачатьТранзакцию

БлокировкаДанных.Заблокировать() //блокировка по регистру

ДокОб.Записать(Проведени) //вот тут конфликт которые выше был заблокирован

ЗафиксироватьТранзакию

Вроде как получается что транзакция проведения (записи) не видит транзакцию, которая выше и получается конфликт?

В 1й схеме вынес запрос за 1ю транзакцию и все норм стало. Код не мой. Просили разобраться почему не работает.
1 Вафель
 
21.02.18
16:03
переходи на упр блокировки
2 Fragster
 
гуру
21.02.18
16:03
в одном сеансе не бывает конфликтов блокировок
3 toypaul
 
гуру
21.02.18
16:05
(2) сфига ли не бывает. когда конфликт это разные транзакции а не сеанс.
4 Fragster
 
гуру
21.02.18
16:09
сеанс в 1с однопоточный
5 toypaul
 
гуру
21.02.18
16:19
(4) и чо. нельзя сделать одновременно 2 транзакции что ли?

я вот не 1й раз уже сталкиваюсь когда

начатьтранзакцию

тут запрос к регистру или каким-то данным объектам

тут запись или проведени и все = привет конфликт блокировок

зафиксироватьтранзакцию()

если сделать так

тут запрос к регистру или каким-то данным объектам

начатьтранзакцию

тут запись или проведение, то все норм

зафиксироватьтранзакцию
6 H A D G E H O G s
 
21.02.18
16:21
Вам бы почитать мануалов.
7 toypaul
 
гуру
21.02.18
16:25
да я сам знаю что надо почитать. будет время почитаю
8 H A D G E H O G s
 
21.02.18
16:39
Когда запрос выносим за транзакцию - на уровне СУБД режим изоляции - Uncommited Read, который снимается как только запрос закончится.
Когда запрос вносим в транзакцию - на уровне СУБД режим изоляции
1) RepeatableRead с S блокировкой до конца транзакции при автоматических блокировках, которая дает взаимоблокировку с X блокировкой Записать().
2) ReadCommited с S блокировкой на момент выполнения запроса при управляемых блокировках, которая не даст взаимоблокировку с X блокировкой Записать() но может исказить обработку результата запроса.
3) ReadCommited snapshot в 8.3 без блокировок на момент выполнения запроса при управляемых блокировках, которая не даст взаимоблокировку с X блокировкой Записать() но может исказить обработку результата запроса.
9 dezss
 
21.02.18
16:43
(8) 2) а как может исказить обработку результата?
10 dezss
 
21.02.18
16:46
(9) + у меня, например, данные меняются до запроса, а потом запросом выбираются эти измененные. (все это в транзакции)
11 H A D G E H O G s
 
21.02.18
16:46
Чтобы обойти проблему 1 в автоматическом режиме в запросе есть оператор ДЛЯИЗМЕНЕНИЯ, который меняет S блокировку на X блокировку на этапе Запроса.

Чтобы обойти проблему 2 и 3 в управляемом режиме есть Объект БлокировкаДанных, которая позволяет наложить X блокировку из кода 1С на уровне сервера 1C не опускаясь до уровня СУБД, ну, либо обработка результата Записать() постфактум и откат транзакции.
12 H A D G E H O G s
 
21.02.18
16:48
(9) 1 транзакция выполнила запрос, s блокировка снята (read commited), либо не накладывалась (read commited snapshot), результат запроса сохранен в ТЗ или выборке, а в это время 2 транзакция сделала Записать(). В базе данные изменились, в ТЗ или выборке - нет.
13 MM
 
21.02.18
16:51
(11) Не Х,а U - на SQL, хотя они и похожи.
14 Fragster
 
гуру
21.02.18
16:51
(8) все прекрасно, но автор говорит, что у него один сеанс
15 dezss
 
21.02.18
17:07
(12) а, понял...ты про "грязное" чтение
но это будет и без транзакции...
16 Вафель
 
21.02.18
17:10
возможно в коде есть какойто алгоритм формирования движений через фоновые задания
17 MM
 
21.02.18
17:19
(15) Это не грязное чтение, а более редкий случай. Например, одни и те же данные в начале проведения могут не совпадать с теми же данными в её конце, потому что другая транзакция в середине их изменяла, но при обоих чтениях данные зафиксированы в БД, т.е. чистые.
18 dezss
 
21.02.18
17:31
(17) тупанул...не грязное, а неповторяющееся чтение...
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.