|
v7: Ошибка SQL State: 40001 Native и результат транзакции | ☑ | ||
---|---|---|---|---|
0
1snik_d
15.04.21
✎
20:01
|
Всем привет. Поясните пожалуйста, что делает 1с 7.7 при возникновении такой ошибки в транзакции.
Пример: НачатьТранзакцию(); ... Выполняем связанные операции в рамках одной транзакции ... Если РезультатВыполненияЛюбойИзПоследовательныхОпераций = 0 Тогда ОтменитьТранзакцию(); Возврат; КонецЕсли; ЗафиксироватьТранзакцию() В процессе выполнения одного из внутритранзакционных действия возникает deadlock. И получается, что 1С не откатывает всю транзакцию, а успевшаяся часть транзакции оказывается зафиксирована. Как с этим бороться? |
|||
1
acht
15.04.21
✎
20:10
|
(0)
НачатьТранзакцию(); Попытка МоиОченьВажныеДействия(); ЗафиксироватьТранзакцию(); Исключение ОтменитьТразакцию(); Сообщить(ОписаниеОшибки()); КонецПопытки; |
|||
2
1snik_d
15.04.21
✎
20:13
|
(1) В процессе выполнения МоиОченьВажныеДействия() и возникает deadlock. Часть операций, которая там успела выполнится, фиксируется в БД, а мне надо, чтоб в случае deadlock откатывалась вся транзакция
|
|||
3
acht
15.04.21
✎
20:14
|
(2) deadlock вызывает исключение в 1С?
|
|||
4
1snik_d
15.04.21
✎
20:16
|
(3) Я и спрашиваю у знающих, как этот механизм работает. По логике вещей, должна вся транзакция откатываться, а оно не так работает. У меня в коде как и у Вас в (1) написано, но похоже, что исключение не вызывается
|
|||
5
1snik_d
15.04.21
✎
20:16
|
Ну т.е. в попытку обернуто
|
|||
6
Злопчинский
15.04.21
✎
21:10
|
(0) " И получается, что 1С не откатывает всю транзакцию, а успевшаяся часть транзакции оказывается зафиксирована. "
хрень какая-т. часть транзакции не может быть зафиксирована. фиксируется или вся часть или ничего (все откатывается) |
|||
7
Злопчинский
15.04.21
✎
21:12
|
(2) "и возникает deadlock. Часть операций, которая там успела выполнится, фиксируется в БД,"
или я чего-то не понял или хрень-2. если дедлок - транзакция активна, не дошла ни до зафиксировать, ни до отменить. ну и будет висеть. потом какогда сеанс рубаняется - транзакция не зафиксируется и все что нажито непосильным трудом - накроется. |
|||
8
Злопчинский
15.04.21
✎
21:13
|
(3) смотря какой дедлок.
у меня вот ошибка есть - входит в клинч один сеанс и остальные по цепочке. и ничего. висят.. ждут... |
|||
9
Злопчинский
15.04.21
✎
21:16
|
ОшибкаОписание = ""; Ошибка Код = "";
НачатьТранзакцию(); Попытка //всякое нужное Исключение // если сломалось что-то ОшибкаКод = ОШИБКА (99999); ОшибкаОписание = ОписаниеОшибки()+" тут содержательная инфочасть"; КонецПопытки; Если ПустаяСтрока(ОшибкаКод) = 0 Тогда // плохо Попытка ОтменитьТранзакцию(); // тут можно в попытку не оборачивать наверное Исключение КонецПопытки; Возврат; КонеЦЕсли; ЗафиксироватьТранзакцию(); Возврат; |
|||
10
Злопчинский
15.04.21
✎
21:18
|
в (0) " возникает deadlock." - не конретизировано что понимается под дидлоком в данном случае
и соответсвенно неясно откуда вывод что что-то фиксируется, а что-то нет. |
|||
11
Злопчинский
15.04.21
✎
21:19
|
Знающие люди говорят, что доступность данных, измененных в транзакции - по разному видится в скульной и файловой версии.
|
|||
12
1snik_d
15.04.21
✎
21:28
|
(6) Да вот фиг там, я тоже так думал, но реально фиксируется часть транзакции
|
|||
13
1snik_d
15.04.21
✎
21:30
|
У меня записываются в транзакции 2 документа и 1 элемент справочника. В результате deadlock элемент справочника записан, один документ записан, второй документ остался неизмененным. И это не единичные случаи
|
|||
14
Злопчинский
15.04.21
✎
21:49
|
(13) запусти. добейся дидлока. кильни сеанс с дидлоком. выйди из базы чтобы никого не было. зайди в базу. данные "частично зафиксированные" - на месте?
|
|||
15
acanta
15.04.21
✎
22:36
|
Если из списка обрабатываемых из журнала документов какие то открыты, дедлок будет?
|
|||
16
ДедМорроз
15.04.21
✎
22:42
|
Если две транзакции блокируют друг друга,то SQL убивает одну из них,чаще всего позднюю по времени.
То есть откатывает и возвращает ошибку. Другая же прекрасно завершается. |
|||
17
ДедМорроз
15.04.21
✎
22:43
|
Попытка изменения открытого документа,это блокировка 1С,а не SQL, и последний о ней может и не знать.
|
|||
18
1snik_d
15.04.21
✎
22:45
|
(15) Нет, не будет
|
|||
19
1snik_d
15.04.21
✎
22:49
|
(16) Это понятно, но по идее, если я в рамках одной транзакции делаю изменения в БД, то и откатываться она должна вся в случае взаимоблокировки, а получается, что не получается. Такое ощущение, что SQL берет и фиксирует транзакцию, вместо ее отката
|
|||
20
acanta
15.04.21
✎
23:17
|
Возможно, это настраивается в опциях sql, там много нерусских букв.
|
|||
21
Злопчинский
16.04.21
✎
09:34
|
ты так и не ответил что за взаимоблокировка у тебя.
|
|||
22
Злопчинский
16.04.21
✎
09:35
|
ни разу не видел чтобы фиксировалась часть транзакции.
ТС что-то, как обычно, недоговаривает |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |