|   |   | 
| 
 | Совместное использование Попытки и Транзакции | ☑ | ||
|---|---|---|---|---|
| 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) Не так.
 Чтение после отката транзакции приводит к данной ошибке | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |