Имя: Пароль:
1C
1C 7.7
v7: Ошибка SQL State: 40001 Native и результат транзакции
,
0 1snik_d
 
15.04.21
20:01
Всем привет. Поясните пожалуйста, что делает 1с 7.7 при возникновении такой ошибки в транзакции.
Пример:
  НачатьТранзакцию();
  ...
  Выполняем связанные операции в рамках одной транзакции
  ...
  Если РезультатВыполненияЛюбойИзПоследовательныхОпераций = 0 Тогда
    ОтменитьТранзакцию();
    Возврат;
  КонецЕсли;

  ЗафиксироватьТранзакцию()

В процессе выполнения одного из внутритранзакционных действия возникает deadlock. И получается, что 1С не откатывает всю транзакцию, а успевшаяся часть транзакции оказывается зафиксирована. Как с этим бороться?
1 acht
 
15.04.21
20:10
(0)
НачатьТранзакцию();
Попытка
    МоиОченьВажныеДействия();
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТразакцию();
    Сообщить(ОписаниеОшибки());
КонецПопытки;
2 1snik_d
 
15.04.21
20:13
(1) В процессе выполнения МоиОченьВажныеДействия() и возникает deadlock. Часть операций, которая там успела выполнится, фиксируется в БД, а мне надо, чтоб в случае deadlock откатывалась вся транзакция
3 acht
 
15.04.21
20:14
(2) deadlock вызывает исключение в 1С?
4 1snik_d
 
15.04.21
20:16
(3) Я и спрашиваю у знающих, как этот механизм работает. По логике вещей, должна вся транзакция откатываться, а оно не так работает. У меня в коде как и у Вас в (1) написано, но похоже, что исключение не вызывается
5 1snik_d
 
15.04.21
20:16
Ну т.е. в попытку обернуто
6 Злопчинский
 
15.04.21
21:10
(0) " И получается, что 1С не откатывает всю транзакцию, а успевшаяся часть транзакции оказывается зафиксирована. "
хрень какая-т.

часть транзакции не может быть зафиксирована.
фиксируется или вся часть или ничего (все откатывается)
7 Злопчинский
 
15.04.21
21:12
(2) "и возникает deadlock. Часть операций, которая там успела выполнится, фиксируется в БД,"
или я чего-то не понял или хрень-2.
если дедлок - транзакция активна, не дошла ни до зафиксировать, ни до отменить.
ну и будет висеть.
потом какогда сеанс рубаняется - транзакция не зафиксируется и все что нажито непосильным трудом - накроется.
8 Злопчинский
 
15.04.21
21:13
(3) смотря какой дедлок.
у меня вот ошибка есть - входит в клинч один сеанс и остальные по цепочке. и ничего. висят.. ждут...
9 Злопчинский
 
15.04.21
21:16
ОшибкаОписание = ""; Ошибка Код = "";
НачатьТранзакцию();
Попытка
  //всякое нужное
Исключение
  // если сломалось что-то
  ОшибкаКод = ОШИБКА (99999);
  ОшибкаОписание = ОписаниеОшибки()+" тут содержательная инфочасть";
КонецПопытки;

Если ПустаяСтрока(ОшибкаКод) = 0
Тогда // плохо
   Попытка ОтменитьТранзакцию(); // тут можно в попытку не оборачивать наверное
   Исключение КонецПопытки;
   Возврат;
КонеЦЕсли;

ЗафиксироватьТранзакцию();
Возврат;
10 Злопчинский
 
15.04.21
21:18
в (0) " возникает deadlock." - не конретизировано что понимается под дидлоком в данном случае
и соответсвенно неясно откуда вывод что что-то фиксируется, а что-то нет.
11 Злопчинский
 
15.04.21
21:19
Знающие люди говорят, что доступность данных, измененных в транзакции - по разному видится в скульной и файловой версии.
12 1snik_d
 
15.04.21
21:28
(6) Да вот фиг там, я тоже так думал, но реально фиксируется часть транзакции
13 1snik_d
 
15.04.21
21:30
У меня записываются в транзакции 2 документа и 1 элемент справочника. В результате deadlock элемент справочника записан, один документ записан, второй документ остался неизмененным. И это не единичные случаи
14 Злопчинский
 
15.04.21
21:49
(13) запусти. добейся дидлока. кильни сеанс с дидлоком. выйди из базы чтобы никого не было. зайди в базу. данные "частично зафиксированные" - на месте?
15 acanta
 
15.04.21
22:36
Если из списка обрабатываемых из журнала документов какие то открыты, дедлок будет?
16 ДедМорроз
 
15.04.21
22:42
Если две транзакции блокируют друг друга,то SQL убивает одну из них,чаще всего позднюю по времени.
То есть откатывает и возвращает ошибку.
Другая же прекрасно завершается.
17 ДедМорроз
 
15.04.21
22:43
Попытка изменения открытого документа,это блокировка 1С,а не SQL, и последний о ней может и не знать.
18 1snik_d
 
15.04.21
22:45
(15) Нет, не будет
19 1snik_d
 
15.04.21
22:49
(16) Это понятно, но по идее, если я в рамках одной транзакции делаю изменения в БД, то и откатываться она должна вся в случае взаимоблокировки, а получается, что не получается. Такое ощущение, что SQL берет и фиксирует транзакцию, вместо ее отката
20 acanta
 
15.04.21
23:17
Возможно, это настраивается в опциях sql, там много нерусских букв.
21 Злопчинский
 
16.04.21
09:34
ты так и не ответил что за взаимоблокировка у тебя.
22 Злопчинский
 
16.04.21
09:35
ни разу не видел чтобы фиксировалась часть транзакции.
ТС что-то, как обычно, недоговаривает