|
Совместное использование Попытки и Транзакции | ☑ | ||
---|---|---|---|---|
0
sergeev-ag-1977
28.03.17
✎
08:22
|
В общем вопрос можно ли одновременно использовать попытку и транзакцию - или достаточно попытки ?
Суть простая: есть 2 связанных документа которые нужно перевесить с одного контрагента на другого и поэтому перевеска должна либо полностью пройти (всё ОК) или не пройти (перечень в перечень косяков). |
|||
1
Lexey_
28.03.17
✎
08:26
|
(0) нужна транзакция, причём тут попытка?
|
|||
2
sergeev-ag-1977
28.03.17
✎
08:31
|
тут суть вопроса в том, что можно ли в попытке объявлять транзакцию - нет ли каких либо платформенных ограничений?
|
|||
3
Lexey_
28.03.17
✎
08:32
|
(2) быстрее проверить, чем ждать ответа здесь
|
|||
4
Лодырь
28.03.17
✎
08:32
|
(2) Попытка - это обработка исключений а не транзакций.
|
|||
5
H A D G E H O G s
28.03.17
✎
08:40
|
Смысл ответа на твой вопрос в том, что "в данной транзакции уже происходили ошибки". Избежать этого можно - максимально быстро выйти за внешнюю транзакцию при исключении, ничего не пиша и не читая из базы, пока ты находишься внутри внешней транзакции
|
|||
6
Остап Сулейманович
28.03.17
✎
08:43
|
(2) "можно ли в попытке объявлять транзакцию". Теоретически - никто не запрещает.
На практике все обстоит с точностью до "наоборот". Попытку помещают в транзакцию. Случились ошибки - делаем откат. Не случились - фиксируем транзакцию. Примерно так: НачатьТранзакцию(); Попытка ВыполнитьОпасныеДействия1(); ВыполнитьОпасныеДействия2(); ... ЗафиксироватьТранзакцию(); Исключение //Не получилось - ну и не надо. Не очень и хотелось. ОтменитьТранзакцию(); КонецПопытки; |
|||
7
FIXXXL
28.03.17
✎
09:06
|
и если в Попытке проводишь доки, проверяй активность тразакции перед фиксацией
|
|||
8
vde69
28.03.17
✎
09:16
|
(6) в такой реализации рискуешь получить ошибку
"в данной транзакции уже происходили ошибки" по этому если есть не явные транзакции (а у автора они есть) делать надо немного по другому... |
|||
9
FIXXXL
28.03.17
✎
09:22
|
(8) вот так я делаю
НачатьТранзакцию() **************** **************** **************** Попытка ОЛЗаказ.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный); ОнлайнЗаказ.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный); ЗаказВБазе = Истина; Исключение ЗаказВБазе = Ложь; ТекстО = ОписаниеОшибки(); Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; КонецПопытки; Если ТранзакцияАктивна() Тогда ЗафиксироватьТранзакцию(); КонецЕсли; |
|||
10
Serg_1960
28.03.17
✎
09:27
|
Мда... эх ма :(
"Следует иметь в виду, что при записи объектов и наборов записей система сама инициирует и фиксирует транзакцию" Источник: "Вложенность транзакций" https://its.1c.ru/db/metod8dev/content/2334/hdoc |
|||
11
FIXXXL
28.03.17
✎
09:40
|
(10) угу, вложенных транзакций не поддерживает 1С
|
|||
12
DrZombi
гуру
28.03.17
✎
10:21
|
(0) Если в цепочке транзакций прервется хоть одна транзакция, то все транзакции прервутся :)
|
|||
13
H A D G E H O G s
28.03.17
✎
10:29
|
(11) расшифруйте
|
|||
14
vde69
28.03.17
✎
10:35
|
(13) расшифровываю:
1с использует глобальный флаг необработанной ошибки транзакции. Этот флаг действует одновременно на все открытые транзакции одного сеанса. с одной стороны это не плохо, но с другой стороны в 1с нет средств с помощью которых можно отследить состояние вложенной транзакции. По этому многие 1с-ники путаются... |
|||
15
FIXXXL
28.03.17
✎
10:44
|
(13)
в моем примере выше: если транзакция проведения документа словит отказ, явно начатая мною транзакция так же уйдет в отказ |
|||
16
bolobol
28.03.17
✎
11:03
|
(15) Это стандартное поведение. Как сделать наоборот? - вот в чём вопрос!
|
|||
17
H A D G E H O G s
28.03.17
✎
11:03
|
(15) А разве где-то по другому? Ну, я просто не имел дел с вложенными транзакциями в ms sql :-) и считаю такое поведение классикой жизни.
|
|||
18
FIXXXL
28.03.17
✎
11:10
|
(17) если 1С явно пишет "1С:Предприятие 8.1 не поддерживает вложенных транзакций.", значит кто-то все же поддерживает
иначе нафига на этом заострять внимание? :) |
|||
19
vde69
28.03.17
✎
11:31
|
(17)
начатьТранзакцию // 1 начатьТранзакцию // 2 зафиксироватьТранзакцию //2 начатьТранзакцию // 3 зафиксироватьТранзакцию //3 зафиксироватьТранзакцию //1 если транзакция 2 уже зафиксирована но транзакция 3 еще не началась какой уровень блокировки будет на данных измененных в транзакции 2 ? ну а теперь пример про сладкое, в след примере ты получаешь ошибку при попытке зафиксировать транзакцию 3 начатьТранзакцию // 1 начатьТранзакцию // 2 отменитьтранзакцию //2 начатьТранзакцию // 3 зафиксироватьТранзакцию //3 зафиксироватьТранзакцию //1 |
|||
20
Feanor
28.03.17
✎
11:42
|
(8) >по этому если есть не явные транзакции (а у автора они есть) делать надо немного по другому...
Все неявные транзакции обязательно приводят к ошибке "в данной транзакции уже происходили ошибки"? Не вижу ничего криминального в (6) |
|||
21
Serg_1960
28.03.17
✎
12:04
|
А криминала, как бы, нет :) Вот только пользователей, да и не только их, иногда ставит в тупик сообщение "В данной транзакции уже происходили ошибки". Я предпочитаю использовать оператор ВызватьИсключение().
|
|||
22
Feanor
28.03.17
✎
12:11
|
(21) спасибо, дошло)
|
|||
23
Вафель
28.03.17
✎
12:16
|
(19) но причем здесь уровень блокировки?
Как бы это перпендикулярные понятия: транзакция и уровень блокировки |
|||
24
Вафель
28.03.17
✎
12:16
|
(20) Не так.
Чтение после отката транзакции приводит к данной ошибке |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |