Имя: Пароль:
1C
 
Совместное использование Попытки и Транзакции
,
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) Не так.
Чтение после отката транзакции приводит к данной ошибке
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший