powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Откат транзакции
14 сообщений из 14, страница 1 из 1
Откат транзакции
    #36263280
User233
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASE 15

Значит есть процедура, внутри неё есть транзакция, внутри транзакции вызывается вторая процедура, а внутри второй ещё и третья. Внутри второй и третьей процедуры своих транзакций не описано. Каждая из процедур делает свои инсерты в разные таблицы. Третья генерирует уникальный номер используемый при инсертах второй процедуры.
Я запускаю первую процедуру с параметром тест, чтобы проверить правильность данных и вставку в таблицы, после завершения делает откат.
Затем процедура запускается с теми же данными, но без параметра тест и транзакция комитится.
Но при этом иногда бывает, что выходит ошибка о наличии записей с уникальным номером, который генерит третья процедура.
Я не пойму, транзакция чтоли не полностью откатывается, или медленно откатывается, или каждая процедура в каких-то своих транзакциях работает...
Вообще, в процедуре генерации номера есть проверка на существование такого и тогда выдаёт не ошибку, а генерит следующий номер, пока не найдёт свободный, либо не дойдёт до предела последовательности. Предел большой, за секунду что происходит проверка до него не дойдёшь.
Поэтому и сомнения, будто для одной процедуры транзакция уже откатилась и она считает что записи с таким номером нет, а для второй процедуры, данные прошлой откаченной транзакции ещё валидны и она возвращает ошибку.
Причём при повторном вызове всей этой байды уже всё проходит нормально.

Вот примерно так выглядит код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create proc Proc1
( @test numeric( 1 ) =  0  )
begin

declare @err numeric( 18 )

begin tran

exec @err = Proc2 
/* внутри Proc2

  exec Proc3

*/
if @err <  0  goto rolltran

...

if @test =  1  rollback /* откатить транзакцию, т.к. попытка создания была для проверки */
else commit

return  1 

rolltran:  rollback

return @err

end
...
Рейтинг: 0 / 0
Откат транзакции
    #36263492
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема скорее в твоем алгоритме генерации уникальных ключей.

запускаются две твои процедуры одновременно
каждая делает проверку существует-ли запись,
сервер обеим говорит что нет,
и одна из процедур вставляет запись - другая получает ошибку.
--
это все пагубная практика. пользуй autoincrement!
или guid()
...
Рейтинг: 0 / 0
Откат транзакции
    #36263503
User233
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так ранее небыло тестового запуска с откатом, и проблема появилась после таких нововведений.
...
Рейтинг: 0 / 0
Откат транзакции
    #36263583
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В третей процедуре должен быть выставлен соответствующий уровень изоляции. Скорее все нужен максимальный уровень serializable
...
Рейтинг: 0 / 0
Откат транзакции
    #36263938
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
User233 пишет:

> Я не пойму, транзакция чтоли не полностью откатывается, или медленно
> откатывается, или каждая процедура в каких-то своих транзакциях работает...

Процедуры и транзакции вообще-то полностью ортогональны друг другу.
Т.е. независимы друг от друга, никак не связаны.

> Вот примерно так выглядит код:

С виду всё хоршо. НО надо не как примерно код выглядит, а как он
точно выглядит.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откат транзакции
    #36263939
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.. пишет:
> запускаются две твои процедуры одновременно

Это как это -- одновременно ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откат транзакции
    #36263942
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old пишет:
> В третей процедуре должен быть выставлен соответствующий уровень
> изоляции. Скорее все нужен максимальный уровень serializable

Тоже абсолютно это тут ни при чём.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откат транзакции
    #36263992
User233
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
> Вот примерно так выглядит код:

С виду всё хоршо. НО надо не как примерно код выглядит, а как он
точно выглядит.

Да так и выглядит, только процедуры называются по другому и другой фигни не относящейся к теме куча.
Посоветуйте решение или укажите на ошибку исходя из приведённого описания.
Не буду же я корпоративный код в интернет выкладывать...
...
Рейтинг: 0 / 0
Откат транзакции
    #36264038
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2MasterZiv
одновременно - из двух разных сессий.
--

2User233
без кода третьей процедуры трудно что-то сказать.

из какой тулзни ты запускаешь процедуру с тестовым параметром ?
не открывается-ли транзакция до вызова процедуры ?
...
Рейтинг: 0 / 0
Откат транзакции
    #36264141
User233
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry..2User233
без кода третьей процедуры трудно что-то сказать.

из какой тулзни ты запускаешь процедуру с тестовым параметром ?
не открывается-ли транзакция до вызова процедуры ?
Третья процедура берёт последний использованный номер из таблицы номеров, плюсует ему единицу, проверяет нет ли такого в таблице куда он будет вставляться, если нету отдаёт выходным параметром его, если есть плюсует ещё единицу
При успешном завершении апдейтит таблицу использованных номеров новым номером.

Запускается это всё из модуля написанного на Дельфи 7
никаких лишних транзакций явно не открывается.
на тестах всё было ок, проблемы пошли при массовом использовании.
...
Рейтинг: 0 / 0
Откат транзакции
    #36264315
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тогда эта проблема описана в моем первом ответе.
несколько решений:

- вместо того чтобы проверять перед вставкой есть такой номер или нет - пытаться вставлять запись и проверять вставилась или нет.

- лочить всю таблицу с номерками еще перед чтением

- использовать autoincrement: снимается куча проблем.
...
Рейтинг: 0 / 0
Откат транзакции
    #36264609
User233
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо!

Ошибка была из-за огромного числа строк и распределения по процедурам, это всё человеческий разум сразу охватить не может. :(

При однократных запусках в однопользовательской среде всё было нормально, но при многих одновременно работающих операторах иногда возникала ошибка из-за того, что после тестового вызова первой процедуры мог быть довольно длительный перерыв, в течении которого другой пользователь мог вносить данные, а потом процедура вызывалась с теми же параметрами, что и в первый раз, т.е. со старым номером, который уже забрал и использовал другой пользователь.
Этот старый номер брался из возвращаемых параметров, передавался в переменную в модуле и потом вновь использовался при повторном вызове.

Ещё раз всем спасибо!
Обсуждение проблемы тут на форуме с вами, натолкнуло на верные мысли! :)
...
Рейтинг: 0 / 0
Откат транзакции
    #36264787
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
User233 пишет:

> Не буду же я корпоративный код в интернет выкладывать...

Ну , тогда и отлаживай сам свой корпоративный код.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Откат транзакции
    #36266075
User233
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
User233 пишет:

> Не буду же я корпоративный код в интернет выкладывать...

Ну , тогда и отлаживай сам свой корпоративный код.

Большое спасибо за ваше участие!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Откат транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]