Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Ошибка SQL State: 40001 Native и результат транзакции

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.