Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Откат транзакции / 14 сообщений из 14, страница 1 из 1
21.10.2009, 07:52
    #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
21.10.2009, 10:13
    #36263492
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат транзакции
Проблема скорее в твоем алгоритме генерации уникальных ключей.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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