|
В данной транзакции уже происходили ошибки?! | ☑ | ||
---|---|---|---|---|
0
vi0
28.12.17
✎
17:37
|
В чем принципиальная ошибка построения программного кода если возникает ошибка "В данной транзакции уже происходили ошибки"?
Ваше мнение. |
|||
1
karabas11
28.12.17
✎
17:38
|
Транзакция в попытке в попытке транзакции
|
|||
2
vde69
28.12.17
✎
17:40
|
транзакция
начало цикла запись документа конец цикла фиксация транзакция |
|||
3
vi0
28.12.17
✎
17:42
|
(2) ну это самый простой случай
бывают множественные вызовы чужих процедур и прочее |
|||
4
hhhh
28.12.17
✎
17:47
|
(3) ну может так
транзакция попытка исключение конецпопытки фиксация транзакция |
|||
5
Вафель
28.12.17
✎
17:49
|
(0) ошибка записи в попытке, и все это в транзакции
|
|||
6
Вафель
28.12.17
✎
17:50
|
После ошибки записи транзакцию нужно отменять
|
|||
7
vde69
28.12.17
✎
17:51
|
(4) на самом деле там все сложнее, твой код может работать нормально а может нет...
ошибки генерятся разные и часть из них влияют на вышестоящую транзакцию а часть нет. То есть тут нет все однозначно |
|||
8
vde69
28.12.17
✎
17:51
|
(6) не правда.... точнее далеко не всегда...
|
|||
9
vi0
28.12.17
✎
17:52
|
Согласен с комментариями выше в части технических причин.
Да, подобные ошибки возникают и из-за этого, но в разветвеленном коде, когда неизвестно где на пути встретится попытка или начало/отмена транзакции, как вы организуете свой код, чтобы подобных ошибок не возникало. |
|||
10
Вафель
28.12.17
✎
17:52
|
(8) Привиди хоть один другой пример
|
|||
11
Вафель
28.12.17
✎
17:52
|
запись/провдение/удаление - считаем за одно и тоже
|
|||
12
vde69
28.12.17
✎
17:53
|
(10) если в модуле обьекта при записи написать
Отказ=Истина верхняя транзакция нормально отработает |
|||
13
vi0
28.12.17
✎
17:53
|
(10) если деление на ноль то можно не откатывать
|
|||
14
vde69
28.12.17
✎
17:54
|
(12) +
или так ВызватьИсключение "парам" то-же не влиет на верхнюю транзакцию |
|||
15
Вафель
28.12.17
✎
17:55
|
(12) ну это и есть ошибка при записи
|
|||
16
Вафель
28.12.17
✎
17:56
|
(12) Хочешь сказать что один из документов не запишется, но транзакция при этом закоммитится?
|
|||
17
vde69
28.12.17
✎
17:56
|
(15) да, но она в таком коде, не запишет только один документ, остальные нормально обработаются
транзакция попытка записьДокумента() исключение конецпопытки фиксация транзакция |
|||
18
hhhh
28.12.17
✎
17:57
|
(9) надо чтобы начало/отмена транзакции были в одной процедуре, ну и если начало транзакции внутри цикла, а отмена где-то еще, я бы не приветствовал.
|
|||
19
Вафель
28.12.17
✎
17:59
|
(17) Ну если в транзакции только один этот документ записывается...
Но фиксация такой транзакции равносильна ее отмене |
|||
20
vi0
28.12.17
✎
18:05
|
(18) что значит в одной?
К примеру есть процедура, которая сама по себе должна содержать транзакцию, чтобы была целостность записи. Есть еще вторая процедура с такими же условиями, но она еще и вызывает первую. |
|||
21
Малыш Джон
28.12.17
✎
18:15
|
(0) Принципиальная ошибка в том, что у тебя в транзакции где-то в коде срабатывает исключение, но ты, никак не проверяя этот факт, далее делаешь ещё какое-то действие, которое возможно только в рамках этой транзакции. А так как в этой транзакции ошибка уже произошла, он тебе, собственно это и пишет.
|
|||
22
ИТ директор
28.12.17
✎
18:19
|
(0) принципиальная ошибка делать так как советует (17)
делать нужно вот так https://its.1c.ru/db/metod8dev#content:2313:hdoc |
|||
23
vi0
28.12.17
✎
18:20
|
а как вам такой типовой код?
СвояТранзакцияОткрыта = Ложь; Попытка НачатьТранзакцию(); СвояТранзакцияОткрыта = Истина; ... Если СвояТранзакцияОткрыта Тогда ЗафиксироватьТранзакцию(); КонецЕсли; Исключение Если СвояТранзакцияОткрыта Тогда ОтменитьТранзакцию(); КонецЕсли; КонецПопытки; |
|||
24
ИТ директор
28.12.17
✎
18:22
|
(23) в какой конфе эта дичь?
|
|||
25
Малыш Джон
28.12.17
✎
18:23
|
(23) Переменная Отказ в обработках записи, проведения и т.д. ведь не просто так используется. Зачем изобретать велосипед?
|
|||
26
Малыш Джон
28.12.17
✎
18:23
|
То есть вот такой код:
НаборЗаписей1.Записать(); НаборЗаписей2.Записать(); может дать такую ошибку А вот такой: Отказ = Ложь; Попытка НаборЗаписей1.Записать(); Исключение Отказ = Истина; КОнецПопытки; Если Не Отказ Тогда Попытка НаборЗаписей2.Записать(); Исключение Отказ = Истина; КонецПопытки; такой ошибки не даст |
|||
27
vi0
28.12.17
✎
18:25
|
(24) Управление торговлей, редакция 11.2 (11.2.3.84)
|
|||
28
ИТ директор
28.12.17
✎
18:26
|
ну в УТ/ERP и счетчики на константах делали, так что я не удивлен
|
|||
29
Вафель
28.12.17
✎
18:29
|
(26) первый код не может дать ошибку из (0)
|
|||
30
Малыш Джон
28.12.17
✎
18:40
|
(29) Да, немного не так
Попытка НаборЗаписи1.Записать(); Исключение КонецПопытки; Попытка НаборЗаписи2.Записать(); Исключение КонецПопытки; вот тут возможна такая ошибка |
|||
31
h-sp
28.12.17
✎
19:12
|
(30) всё равно в разных транзакциях
|
|||
32
vde69
28.12.17
✎
23:07
|
(22) Вы почитайте чего я писал выше по тексту...
в (17) я привел пример случая когда ошибка не оттранслированя с СУБД не приводит к отату верхней транзакции... хотя в отдельных случаях конструкция (17) вполне может применятся сознательно и будет правомерной. |
|||
33
Tateossian
29.12.17
✎
00:59
|
(26) В последних версиях платформы отказ (8.3) равносилен возврату и нет смысла проверять на отказ. Кстати, я в какой-то момент попался на этом.
(30) На самом деле методологи 1С за такое по шапке дадут, ибо по канонам записывать нужно вот так Движения.Записать(); А у конкретных наборов объекта движений документа установить свойство Движения.НаборЗаписейЧегоТо.Записывать = Истина. А свойство записывать установлено в "Записывать модифицированные" |
|||
34
Tateossian
29.12.17
✎
01:02
|
(17) Принципиальная ошибка. Вот тут
транзакция попытка записьДокумента() исключение Откат транзакции <- Обязательно конецпопытки фиксация транзакция Ибо счетчик транзакций не сбросится в ноль и любая следующая транзакция выдаст ошибку из заголовка (а ты потом ходи ищи ошибку в коде). |
|||
35
H A D G E H O G s
29.12.17
✎
01:08
|
(34) Не факт. Например, в типовых БСП ошибки фиксируются записью в регистр. Выходом является установка заглушки через ДополнительныеСвойства
|
|||
36
Tateossian
29.12.17
✎
01:36
|
(35) Разумеется, написанное мною - это самый простой случай:) В хороших (универсальных) решениях, претендующих на роль библиотечных решений, должно быть больше возможностей для анализа. Вот тут неплохая статья на ИТС обо всем этом:
https://its.1c.ru/db/v8std#content:-2145783148:hdoc:_top:транзакция%20зафиксировать |
|||
37
H A D G E H O G s
29.12.17
✎
01:45
|
(36) А ты повзрослел, прямо на моих глазах, хнык.
Ведь я тебя помню совсем юным, v8: Вопрос по оптимизации (1) |
|||
38
Tateossian
29.12.17
✎
02:12
|
(37) Спасибо:) Я дорос до целого начальника:) И мистяне тут не на последнем месте.
|
|||
39
vi0
10.01.18
✎
13:28
|
(36) Метод хороший - тот, который предлагается в п. 3.6
Единственное, в Журнале регистрации будет зарегистрировано столько одинаковых ошибок, сколько было вложенных транзакций. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |