Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Что блокируется при вызове НачатьТранзакцию?

Что блокируется при вызове НачатьТранзакцию?
Я
   ИС-2
 
17.11.20 - 09:39
заметил, что при длительном выполнении кода в транзакции происходит падение производительности. Пользователи не могут проводить документы.

При выполнении кода в транзации блокируются все объекты?

НачатьТранзакицию();
тут код
ЗафиксироватьТранзакцию()
   ДенисЧ
 
1 - 17.11.20 - 09:41
В транзакции (чистой) ничего не блокируется.
А вот если в ней ты начинаешь менять объекты БД - они блокируются. В худшем случае - вся таблица (и связанные с ней)
   Волшебник
 
2 - 17.11.20 - 10:09
(1) Все прочитанные объекты так же блокируются.
   ИС-2
 
3 - 06.01.21 - 10:52
Чем можно заменить НачатьТранзакицию() ? Надо, чтобы документы не записывались, если про обработке хоть одного документа произошла ошибка
   H A D G E H O G s
 
4 - 06.01.21 - 11:00
Ничем
   Cyberhawk
 
5 - 06.01.21 - 11:50
"Пользователи не могут проводить документы" // Подробнее
   Fedor-1971
 
6 - 06.01.21 - 12:01
(3)
НачатьТранзакцию()
  тут обработка многих документов
ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() при наличии ошибки

Транзакции не имеют вложенности, т.е., например, проведение документов внутри одной глобальной транзакции откатит все изменения при ошибке в одном из них, стандартно скажет "В транзакции уже происходили ошибки".
Вывод более внятного сообщения придётся изобрести самому
   hhhh
 
7 - 06.01.21 - 13:31
(5) ну если файловая база, то так и есть.
   fisher
 
8 - 06.01.21 - 13:36
(3) Добро пожаловать в мир ACID.
Поподробнее. Обычные блокировки или управляемые? Какая СУБД? Что за конфа? Какое количество документов в транзакции и каких (чего они двигают)?
Проблема же не только в "чтобы документы не записывались, если про обработке хоть одного документа произошла ошибка". Нужно чтобы и параллельные действия других пользователей в то же время не привели к нарушению логической целостности данных.
   ДедМорроз
 
9 - 06.01.21 - 15:00
Транзакция включает режим отслеживания в базе данных.
Любое чтение любого объекта из базы приводит к установке блокировки на чтение,а любое изменение-блокировки на запись.
Если объект заблокирован на чтение,то при попытке его изменения сервер останавливается и ждёт,пока все блокировки на чтение будут сняты.
При блокировке на запись аналогично,только если объект заблокирован на запись(изменён),то любой другой сеанс не сможет выполнить чтение,то есть будет выполнено ожидание снятия блокировки,то есть подтверждения или отмены транзакции.
Если две транзакции заблокировали друг друга,то это называется DeadLock и одну из них скинут с ошибкой.
Также у транзакции есть максимальное время ожидания после которого она завершается с ошибкой
   fisher
 
10 - 06.01.21 - 18:02
(9) Поведение зависит от уровня изоляции транзакций
   ИС-2
 
11 - 07.01.21 - 12:19
(3) УПП с управляемыми блокировками. Остальное верно.

Например, я перепровожу РТиУ и расходный ордер. Если при перепроведении РО ошибка, то РТиУ должна откатиться
   ДедМорроз
 
12 - 07.01.21 - 13:44
(10) в 1с мы не можем менять уровень изоляции.
Понятно,что есть версионные sql-серверы,где может существовать несколько версий одной и той же записи в таблице,но там и транзакции могут быть неблокирующие,и прочитать можно как последнее подтвержденное значение,так и последнее установленное,но не подтвержденное.
   SleepyHead
 
13 - 07.01.21 - 14:47

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.