
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
21.10.2009, 07:52
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 10:13
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
Проблема скорее в твоем алгоритме генерации уникальных ключей. запускаются две твои процедуры одновременно каждая делает проверку существует-ли запись, сервер обеим говорит что нет, и одна из процедур вставляет запись - другая получает ошибку. -- это все пагубная практика. пользуй autoincrement! или guid() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 10:17
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
Так ранее небыло тестового запуска с откатом, и проблема появилась после таких нововведений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 10:42
|
|||
|---|---|---|---|
Откат транзакции |
|||
|
#18+
В третей процедуре должен быть выставлен соответствующий уровень изоляции. Скорее все нужен максимальный уровень serializable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 12:30
|
|||
|---|---|---|---|
Откат транзакции |
|||
|
#18+
User233 пишет: > Я не пойму, транзакция чтоли не полностью откатывается, или медленно > откатывается, или каждая процедура в каких-то своих транзакциях работает... Процедуры и транзакции вообще-то полностью ортогональны друг другу. Т.е. независимы друг от друга, никак не связаны. > Вот примерно так выглядит код: С виду всё хоршо. НО надо не как примерно код выглядит, а как он точно выглядит. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 12:31
|
|||
|---|---|---|---|
Откат транзакции |
|||
|
#18+
Dmitry.. пишет: > запускаются две твои процедуры одновременно Это как это -- одновременно ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 12:32
|
|||
|---|---|---|---|
Откат транзакции |
|||
|
#18+
Ggg_old пишет: > В третей процедуре должен быть выставлен соответствующий уровень > изоляции. Скорее все нужен максимальный уровень serializable Тоже абсолютно это тут ни при чём. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 12:46
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
MasterZiv > Вот примерно так выглядит код: С виду всё хоршо. НО надо не как примерно код выглядит, а как он точно выглядит. Да так и выглядит, только процедуры называются по другому и другой фигни не относящейся к теме куча. Посоветуйте решение или укажите на ошибку исходя из приведённого описания. Не буду же я корпоративный код в интернет выкладывать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 12:57
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
2MasterZiv одновременно - из двух разных сессий. -- 2User233 без кода третьей процедуры трудно что-то сказать. из какой тулзни ты запускаешь процедуру с тестовым параметром ? не открывается-ли транзакция до вызова процедуры ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 13:27
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
Dmitry..2User233 без кода третьей процедуры трудно что-то сказать. из какой тулзни ты запускаешь процедуру с тестовым параметром ? не открывается-ли транзакция до вызова процедуры ? Третья процедура берёт последний использованный номер из таблицы номеров, плюсует ему единицу, проверяет нет ли такого в таблице куда он будет вставляться, если нету отдаёт выходным параметром его, если есть плюсует ещё единицу При успешном завершении апдейтит таблицу использованных номеров новым номером. Запускается это всё из модуля написанного на Дельфи 7 никаких лишних транзакций явно не открывается. на тестах всё было ок, проблемы пошли при массовом использовании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 14:07
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
тогда эта проблема описана в моем первом ответе. несколько решений: - вместо того чтобы проверять перед вставкой есть такой номер или нет - пытаться вставлять запись и проверять вставилась или нет. - лочить всю таблицу с номерками еще перед чтением - использовать autoincrement: снимается куча проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 15:15
|
|||
|---|---|---|---|
|
|||
Откат транзакции |
|||
|
#18+
Всем большое спасибо! Ошибка была из-за огромного числа строк и распределения по процедурам, это всё человеческий разум сразу охватить не может. :( При однократных запусках в однопользовательской среде всё было нормально, но при многих одновременно работающих операторах иногда возникала ошибка из-за того, что после тестового вызова первой процедуры мог быть довольно длительный перерыв, в течении которого другой пользователь мог вносить данные, а потом процедура вызывалась с теми же параметрами, что и в первый раз, т.е. со старым номером, который уже забрал и использовал другой пользователь. Этот старый номер брался из возвращаемых параметров, передавался в переменную в модуле и потом вновь использовался при повторном вызове. Ещё раз всем спасибо! Обсуждение проблемы тут на форуме с вами, натолкнуло на верные мысли! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.10.2009, 16:07
|
|||
|---|---|---|---|
Откат транзакции |
|||
|
#18+
User233 пишет: > Не буду же я корпоративный код в интернет выкладывать... Ну , тогда и отлаживай сам свой корпоративный код. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=55&mobile=1&tid=2010861]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 383ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...