|
Что блокируется при вызове НачатьТранзакцию? | ☑ | ||
---|---|---|---|---|
0
ИС-2
naïve
17.11.20
✎
09:39
|
заметил, что при длительном выполнении кода в транзакции происходит падение производительности. Пользователи не могут проводить документы.
При выполнении кода в транзации блокируются все объекты? НачатьТранзакицию(); тут код ЗафиксироватьТранзакцию() |
|||
1
ДенисЧ
17.11.20
✎
09:41
|
В транзакции (чистой) ничего не блокируется.
А вот если в ней ты начинаешь менять объекты БД - они блокируются. В худшем случае - вся таблица (и связанные с ней) |
|||
2
Волшебник
17.11.20
✎
10:09
|
(1) Все прочитанные объекты так же блокируются.
|
|||
3
ИС-2
naïve
06.01.21
✎
10:52
|
Чем можно заменить НачатьТранзакицию() ? Надо, чтобы документы не записывались, если про обработке хоть одного документа произошла ошибка
|
|||
4
H A D G E H O G s
06.01.21
✎
11:00
|
Ничем
|
|||
5
Cyberhawk
06.01.21
✎
11:50
|
"Пользователи не могут проводить документы" // Подробнее
|
|||
6
Fedor-1971
06.01.21
✎
12:01
|
(3)
НачатьТранзакцию() тут обработка многих документов ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() при наличии ошибки Транзакции не имеют вложенности, т.е., например, проведение документов внутри одной глобальной транзакции откатит все изменения при ошибке в одном из них, стандартно скажет "В транзакции уже происходили ошибки". Вывод более внятного сообщения придётся изобрести самому |
|||
7
hhhh
06.01.21
✎
13:31
|
(5) ну если файловая база, то так и есть.
|
|||
8
fisher
06.01.21
✎
13:36
|
(3) Добро пожаловать в мир ACID.
Поподробнее. Обычные блокировки или управляемые? Какая СУБД? Что за конфа? Какое количество документов в транзакции и каких (чего они двигают)? Проблема же не только в "чтобы документы не записывались, если про обработке хоть одного документа произошла ошибка". Нужно чтобы и параллельные действия других пользователей в то же время не привели к нарушению логической целостности данных. |
|||
9
ДедМорроз
06.01.21
✎
15:00
|
Транзакция включает режим отслеживания в базе данных.
Любое чтение любого объекта из базы приводит к установке блокировки на чтение,а любое изменение-блокировки на запись. Если объект заблокирован на чтение,то при попытке его изменения сервер останавливается и ждёт,пока все блокировки на чтение будут сняты. При блокировке на запись аналогично,только если объект заблокирован на запись(изменён),то любой другой сеанс не сможет выполнить чтение,то есть будет выполнено ожидание снятия блокировки,то есть подтверждения или отмены транзакции. Если две транзакции заблокировали друг друга,то это называется DeadLock и одну из них скинут с ошибкой. Также у транзакции есть максимальное время ожидания после которого она завершается с ошибкой |
|||
10
fisher
06.01.21
✎
18:02
|
(9) Поведение зависит от уровня изоляции транзакций
|
|||
11
ИС-2
naïve
07.01.21
✎
12:19
|
(3) УПП с управляемыми блокировками. Остальное верно.
Например, я перепровожу РТиУ и расходный ордер. Если при перепроведении РО ошибка, то РТиУ должна откатиться |
|||
12
ДедМорроз
07.01.21
✎
13:44
|
(10) в 1с мы не можем менять уровень изоляции.
Понятно,что есть версионные sql-серверы,где может существовать несколько версий одной и той же записи в таблице,но там и транзакции могут быть неблокирующие,и прочитать можно как последнее подтвержденное значение,так и последнее установленное,но не подтвержденное. |
|||
13
SleepyHead
гуру
07.01.21
✎
14:47
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |