![]() |
![]() |
![]() |
|
ОтменитьТранзакцию() не срабатывает | ☑ | ||
---|---|---|---|---|
0
nikulya
07.10.10
✎
16:08
|
Уважаемые знатоки! Есть ли объяснение того что не откатывается транзакция в следующем коде:
Попытка НачатьТранзакцию(); ДокИсточник.Удалить(0); ДокПриемник.Записать(); ДокПриемник.Провести(); а=1/0; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
1
Ёпрст
гуру
07.10.10
✎
16:09
|
Есть. нефик транзакцию в попытку оборачивать таким извращенным способом.
|
|||
2
nikulya
07.10.10
✎
16:10
|
а как посоветуешь??
|
|||
3
NS
07.10.10
✎
16:11
|
начатьтранзакцию() вроде вне попытки нужно делать.
|
|||
4
YHVVH
07.10.10
✎
16:11
|
(0) мрак
|
|||
5
YF
07.10.10
✎
16:14
|
(0) При ошибке в транзакции она же отменится без твоего отменитьТранзакцию()
|
|||
6
NS
07.10.10
✎
16:17
|
Нет, и в попытке работает.
так что (0) что-то не договариваешь. (5) В попытке - нет. |
|||
7
nikulya
07.10.10
✎
16:20
|
да все договариваю.... идет на отменуТранзакции(), в отладчике проверял. Но ничего не откатывается. 1 Документ удаляется, 2 перепроводится
|
|||
8
YHVVH
07.10.10
✎
16:22
|
а так
НачатьТранзакцию(); Попытка ДокИсточник.Удалить(0); ДокПриемник.Записать(); ДокПриемник.Провести(); а=1/0; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
9
nikulya
07.10.10
✎
16:24
|
(8) тот же эффект. не откатывает
|
|||
10
YF
07.10.10
✎
16:25
|
НачатьТранзакцию();
ДокИсточник.Удалить(0); ДокПриемник.Записать(); ДокПриемник.Провести(); а=1/0; Попытка ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
11
1Сергей
07.10.10
✎
16:26
|
(10) это ошибку скажет
|
|||
12
1Сергей
07.10.10
✎
16:26
|
деление на 0
|
|||
13
YHVVH
07.10.10
✎
16:27
|
(9) гонишь
|
|||
14
Ёпрст
гуру
07.10.10
✎
16:27
|
(7)врешь..
Всё там работает.. и в (0) тоже. Ты просто проверять не умеешь. |
|||
15
YHVVH
07.10.10
✎
16:27
|
у тебя не случ не вложенная транзакция?
|
|||
16
YF
07.10.10
✎
16:28
|
(11) Я думал у (0) деление на 0 поставлено для проверки того отменяется ли транзакция
|
|||
17
Ёпрст
гуру
07.10.10
✎
16:28
|
+14
Док = СоздатьОбъект("Документ"); Док.НайтиДокумент(ВыбДок); Сообщить(Док.ПометкаУдаления()); Попытка НачатьТранзакцию(); Док.Удалить(0); а=1/0; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; Сообщить(Док.ПометкаУдаления()); //так проверяешь ты и видишь 1 Док.НайтиДокумент(ВыбДок); Сообщить(Док.ПометкаУдаления());//а вот так нужно на самом деле, и вернёт 0, как и есть на самом деле. |
|||
18
YHVVH
07.10.10
✎
16:28
|
100 пудняк стоит выше по тексту еще какаяето хрень типа начать транзакцию.
|
|||
19
Ёпрст
гуру
07.10.10
✎
16:29
|
(9) откатывает.
|
|||
20
Ёпрст
гуру
07.10.10
✎
16:30
|
(18) ничего там не стоит, он просто проверять не умеет, и смотрит в отладчике, а не в самом журнальчике глазками, к примеру.
|
|||
21
YHVVH
07.10.10
✎
16:30
|
(20) ну фиг знает тогда. врет значит.
|
|||
22
Z1
07.10.10
✎
16:31
|
ВсеХорошо = 1;
НачатьТранзакцию(); Попытка ДокИсточник.Удалить(0); ДокПриемник.Записать(); ДокПриемник.Провести(); а=1/0; Исключение ВсеХорошо = 0; КонецПопытки; Если ВсеХорошо = 1 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; |
|||
23
ilya_i
07.10.10
✎
16:32
|
(7) "1 Документ удаляется, 2 перепроводится"
т.е. в цикле, а транзакция, для каждого документа? |
|||
24
YHVVH
07.10.10
✎
16:33
|
достал чипсы
|
|||
25
nikulya
07.10.10
✎
16:36
|
я смотрю в журнале собственными глазками. обработка объединяет 2 документа. потом удаляет первый и сохраняет и перепроводит второй. хочется если что то не получится откатить транцакцию, но конструкция не работает. пробовал по всякому
|
|||
26
YHVVH
07.10.10
✎
16:40
|
(25) у всех работает.
|
|||
27
YHVVH
07.10.10
✎
16:41
|
(18) смотрел?
|
|||
28
Ёпрст
гуру
07.10.10
✎
16:42
|
(25) врешь.
|
|||
29
Z1
07.10.10
✎
16:45
|
(25) может у тебя нарушена парность и/или количество скобок транзакций.
|
|||
30
nikulya
07.10.10
✎
16:52
|
Вот так работает. Откатывает без проблем.
ВсеХорошо = 1; НачатьТранзакцию(); Попытка ДокИсточник.Удалить(0); ДокПриемник.Записать(); а=1/0; Исключение ВсеХорошо = 0; КонецПопытки; Если ВсеХорошо = 1 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; А в проведении есть sql вставка. Наверно из за этого не срабатывает. |
|||
31
YHVVH
07.10.10
✎
16:54
|
я так понял без проведения у тебя все хорошо?
(30) какая вставка не понял? |
|||
32
nikulya
07.10.10
✎
16:54
|
причем вызывается из проведения хранимка. Закоментил вызов SQL хранимки и все заработало.
|
|||
33
YF
07.10.10
✎
16:57
|
(32) Что за хранимка? Как вызывается?
|
|||
34
YHVVH
07.10.10
✎
16:59
|
хранимка фиксирует начатаю транзакцию - оригинально
|
|||
35
nikulya
07.10.10
✎
16:59
|
хранимка написанная на sql. вызывается через компоненту rmSQL.
|
|||
36
nikulya
07.10.10
✎
17:00
|
ВсеХорошо = 1;
НачатьТранзакцию(); Попытка ДокПриемник.Записать(); ДокПриемник.Провести(); ДокИсточник.Удалить(0); а=1/0; Исключение ВсеХорошо = 0; КонецПопытки; Если ВсеХорошо = 1 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; |
|||
37
nikulya
07.10.10
✎
17:00
|
ЗАРАБОТАЛА..... Всем спасибо.
|
|||
38
Z1
07.10.10
✎
17:15
|
(32) для хранимки учитывай обязательно 29.
Также если твой хранимка откатит транзакцию могут начаться забавные вещи. ( после этого откроется неявная транзакция и зафиксировать транзакцию будет лишним, а Зафиксировать транзакцию зафиксирует данные от места отмены транзакции) + на это на все еще накладывается включение выключение режима неявных транзакций. |
|||
39
artbear
07.10.10
✎
17:29
|
Напомните - Удалить(0) ставит только пометку удаления?
|
|||
40
Z1
07.10.10
✎
17:32
|
Удалить(0) - да ставит только пометку
Удалить(1) удаляет документ из базы. но если база УРБД то все равно позже документ может и вернуться |
|||
41
nikulya
07.10.10
✎
17:49
|
(38) по моему транзакция SQL и 1с транзакция не связаны. Во всяком случае нельзя например откатить SQL транзакцию из 1С
|
|||
42
Z1
07.10.10
✎
17:57
|
(41) ошибаешься
для v77 ms sql НачатьТранзакцию() - на sql сервер приходит begin tran ЗафиксироватьТранзакцию(); - commit ОтменитьТранзакцию(); rollback - только для отката они еще вроде проверяют уровень вложености ( вот этого точно не помню сейчас ) |
|||
43
nikulya
07.10.10
✎
18:00
|
(42) интересно. в профайлере проверю. а ты не знаешь как можно отменить из 1с транзакцию которая была запущена из хранимки на sql сервере??
|
|||
44
DK_L
07.10.10
✎
18:09
|
епрст3 - скорее всего из 1С-а :)
|
|||
45
Z1
07.10.10
✎
18:11
|
(43) Так по барабану откуда отменять главная чтобы скобки
begin tran и cjmmit были правильными. >>>отменить из 1с транзакцию rc.ВыполнитьСкалятный("rollback"); - только учти что в MS sql нет вложенных транзакций - отмениться все. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |