powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Ошибка сериализации
23 сообщений из 48, страница 2 из 2
Ошибка сериализации
    #34955075
KOLCHOZ_POSTEVENT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если его можно заменить каким-то индексом,который не подразумевает того,что он отсортирован-я бы посоветовал попробывать.Убрать совсем-разве что,если таблица небольшая-только для эксперемента,да и то не очень корректного-инсерты пойдут на ура,селекты будут застревать,но не смертельно,если таблица до 1000,так скажем.Мёртвых блокировок не то что бы не будет-скажем так,не должно быть.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34956871
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ищи кто кого блокирует на уровне базы.
какая база-то?
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34957372
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нет обработок по триггеру, через процедуру вставлять строки не хочется, а проблема не решается, то может все таки попробовать сделать то, что советовали в самом начале ?

SQLCA.autocommit=True
, ну и немного изменить обработку :
DRodСоединение в приложении:
SQLCA.autocommit=false;
....
В DW под событие dberror стоит ROLLBACK; и сообщение "Повторите попытку...".
Под кнопкой "Сохранить":
ll_ret = dw.Update()
if ll_ret <> 1 then
MessageBox("Ошибка","Нельзя записать ЗАГОЛОВОК документа!)
return
end if
COMMIT;
....
Блокировка таблицы продолжается пока заблокировавший пользователь не выйдет из приложения, т.е. разорвёт соедиенение.
Конечно не мое собачье дело, но если произошло событие "DBERROR", то есть необходимость в ROLLBACK ? Или необходимо обеспечивать запись только блока строк ?
Во вторых, даже если autocommit=false, почему бы после этих операций не "разорвать соедиенение" самому, без выхода из приложения ?
Да и воспользоваться, не SQLCA, а своей транзакцией, которую потом можно и уничтожить ( для гарантии :-) ) ?

Transaction tran
tran = CREATE Transaction
...
tran.autocommit=false
...
COMMIT USING tran;
DISCONNECT USING tran;
DESTROY tran

И в третьих - у нас похожая проблема добавления связанных записей в нескольких таблиц, при которой происходить куча проверок, добавление вычисляемых значений, работа триггеров, при одновременной работе большого количества пользователей - успешно решается при использовании процедуры ( Microsoft SQL ).

CREATE PROCEDURE ....
.....
select @lock=1
while (@lock=1)
select @lock=lock from aaaaaaa
BEGIN TRANSACTION
update aaaaaaa set lock=1
.....
if @@error<>0
begin
Rollback transaction
return
end
.......
update aaaaaaa set lock=0
......
COMMIT TRANSACTION
......
GO


Good Luck !
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34958124
DRod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry.ищи кто кого блокирует на уровне базы.
какая база-то?
См [4933666] вверху страницы:
- В сообщении об ошибке указано имя пользователя,
- Adaptive Server Anywhere 5.5.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34958271
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DRod wrote:

> - Adaptive Server Anywhere 5.5.

Сразу видно глубину знаний (точнее, отсутствие таковой).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34958402
DRod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Chv
1) SQLCA.autocommit=False. Это мне досталось о предыдущих поколений программистов, разрабатывавших данную корпоративную систему. "...Иных уж нет, а те - далече...". Боюсь поменять на autocommit=True.
"...есть необходимость в ROLLBACK?...". А как же завершить транзакцию? Можно откат поставить после dw.Update(), но я ставлю в событие "DBERROR".
2) Пробовал уничтожать транзакционный объект. Не помогло.
3) Добавление записи не на уровне приложения (DataWindow), а на уровне базы данных (процедура), мне кажется самый перспективный путь решения моей проблемы. Буду пробовать...
Спасибо за конструктивные предложения!
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34958497
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DRod wrote:

> 1) SQLCA.autocommit=False. Это мне досталось о предыдущих поколений
> программистов, разрабатывавших данную корпоративную систему. "...Иных
> уж нет, а те - далече...". Боюсь поменять на autocommit=True.

И не нужно. Транзакции - вещь довольно полезная в хозяйстве ;).

> Можно откат поставить после dw.Update(), но я ставлю в событие "DBERROR".

Нужно поставить после Update(). Или вообще переписать эту халтуру на
Embedded SQL.

> 3) Добавление записи не на уровне приложения (DataWindow), а на уровне
> базы данных (процедура), мне кажется самый перспективный путь решения
> моей проблемы.

Стрельба из пушки по воробьям.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34958591
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChVесли произошло событие "DBERROR", то есть необходимость в ROLLBACK ? Или необходимо обеспечивать запись только блока строк ?

Rollback всегда нужно делать после неуспешного dw.Update() (и не в dberror, а после Update() )
Это связано с тем, что в этом случае статусы измененных строк в DW не сбрасываются и если не сделать rollback, то при последующих Update() произойдет повторное проведение операций DML, что в случае Insert вызовет ошибку из-за дубля Primary key, а в случае Delete/Update - Row changed between retrieve and update (в DW с настройками update по умолчанию).
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34958642
+/-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+/-
Гость
то есть, кто то нажмет два раза сохранить и получит ту ошибку о которой идет речь?
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34959061
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. "[Sybase][ODBC Driver]Serialization failure: user 'Kilinskaya' has the row in 'TLK_O_demands' locked"
не помню такой ошибки. по моему это не родной АСА драйвер... что пользуем?

2. запустите утилиту dbwatch чтобы посмотреть коннекты и у кого сколько незакомиченых транзакций.
альтернативная утилита для АСА 5.0 есть здесь

3. помнится в аса при определенном уровне чтения (isolation level) после ретрайва данных лочились записи.
так что на "retrieve end" приходилось вешать роллбек или коммит. какой isolation level ?

4. если в DW стоит "Retrieve As Needed" то этот DW на ретрайве может блокировать строки т.к. держит открвтвм курсор.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34959574
DRod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Dmitry
1) SQLDBCODE[-210]. ASA 5.5.
2) Спасибо за DbWatch+.
3) isolation level = 0.
4) "Retrieve As Needed" не указаною
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34959632
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то абсурд. Мы делаем коммиты там и роллбеки всякие а блокировки стоят намертво пока из приложения не выйдем? Так не бывает.
Есть тут спецы по ASA которые в курсе как там с вложенными транзакциями.
Такое можно было бы устроить с MSSQL если начать транзакцию, потом начать вложенную. но даже в этом случае при первом же ROLLBACK блокировки снимаются.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34959678
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DRod ,
начните с того, что научитесь стабильно повторять ошибку.
В 90% случаев после этого будет ясно, что надо исправить.

А пока ошибка нестабильна - это все гадание на кофейной гуще.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34960236
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не особо спец в ASA, но можно было бы проверить, что из блокировок используется на таблицу APL или Datarow
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34960289
Фотография ChV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky ChVесли произошло событие "DBERROR", то есть необходимость в ROLLBACK ? Или необходимо обеспечивать запись только блока строк ?

Rollback всегда нужно делать после неуспешного dw.Update() (и не в dberror, а после Update() )
Это связано с тем, что в этом случае статусы измененных строк в DW не сбрасываются и если не сделать rollback, то при последующих Update() произойдет повторное проведение операций DML, что в случае Insert вызовет ошибку из-за дубля Primary key, а в случае Delete/Update - Row changed between retrieve and update (в DW с настройками update по умолчанию).
Неуспешные dw.Update() я отрабатываю, но спасибо, буду иметь ввиду. "Век живи - век учись, а ..."

Good Luck !
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34960308
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001 wrote:

> проверить, что из блокировок используется на таблицу APL или Datarow

Блин. У человека SA 5.5, при чём тут все эти ASEшные заморочки???
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34960406
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрей wrote:

> Какой-то абсурд. Мы делаем коммиты там и роллбеки всякие а блокировки
> стоят намертво пока из приложения не выйдем? Так не бывает.

Мой опыт показывает, что блокировки там, где их не ждали, возникают по
одной из 2 причин:

1) не сделан COMMIT/ROLLBACK после INSERT/UPDATE/DELETE;
2) временно поднят и не опущен уровень изоляции.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34961559
DRod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky DRod ,
начните с того, что научитесь стабильно повторять ошибку.
Эх! Если бы я мог повторять ошибку, я бы конечно её нашёл и исправил.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34961917
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DRodЭх! Если бы я мог повторять ошибку, я бы конечно её нашёл и исправил.
Поставьте юзерам где наблюдаются ошибки и блокировки отладочную версию программы, где протоколируйте каждое действие юзера (пункты меню, действия с документами - открытие, создание, сохранения, выход без сохранения, и т.д. вплоть до изменения каждого поля), каждый messagebox. Потом по логу пытайтесь повторить и детализируйте лог если не удается повторить ошибку.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34961941
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно пойти и немного другим путем: найти все места в программе с операторами commit/rollback и протоколировать их вызов и какая ф-я вызывала.
Потом после возникновения ошибки анализировать этот лог сравнивая его с логом полученным без ошибки.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34962273
DRod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Anatoly Moskovsky
Спасибо. Буду записывать в лог контрольные точки с именами пользователей и компьютеров после:
- begin transaction,
- rollback,
- commit.
Затем буду анализирвать лог.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #34962637
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DRodБуду записывать в лог контрольные точки с именами пользователей и компьютеров после:
- begin transaction,
- rollback,
- commit.
Затем буду анализирвать лог.
Есть еще места где commit/rollback происходят неявно - disconnect/re-connect/ и потенциально Execute Immediate (с DDL).

У меня был случай, когда кодер вместо того, чтобы использовать специально выделенный метод of_getconnect, в котором сеансы повторно использовались, по незнанию использовал просто connect using. И другой код, в котором по ошибке не было commit, по случайности работал верно из-за неявного коммита при disconnect.
Когда же код привели в соответсвие со стандартом, в том коде, где не было коммита вылезло непонятное поведение.
...
Рейтинг: 0 / 0
Ошибка сериализации
    #35097421
DRod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ларчик вот так открывался:

SQLCA.DBParm = "ConnectString='...' " + ",CursorLock='OptValue',CursorScroll='Dynamic' "

В хелпе PB6.5 параметр соединения CursorScroll (ODBC) DBParm:

Dynamic scrolling in SQL Anywhere 5.x and Watcom SQL 4.0b If you are accessing a SQL Anywhere Version 5.x or Watcom SQL Version 4.0b database and want to execute an embedded SQL FETCH FIRST, FETCH PRIOR, or FETCH LAST statement when you retrieve a row from a cursor, you must set CursorScroll to 'Dynamic'. Otherwise, the default for these DBMSs is to do forward scrolling (FETCH NEXT) only.

Спасибо моему другу "Великому GAA"!
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Ошибка сериализации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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