powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / gds 335544382: всегда ли это "cannot update erased record" ?
8 сообщений из 8, страница 1 из 1
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615704
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
 session #1 
SQL> recreate table t(id int, f01 int); commit;
SQL> delete from t; 
SQL> insert into t select row_number()over(), row_number()over()*100 from rdb$types rows 5;
SQL> select * from t; commit; 

          ID          F01
============ ============
           1          100
            2          200 
           3          300
           4          400
           5          500

SQL> delete from t where id=2; -- commit сейчас НЕ делаем!

 session #2 
commit;
set transaction  read committed record_version   lock timeout 10 ;

set term ^;
execute block returns( gds int ) as
declare x int;
begin
   --select id from t where id=2 for update with lock into x;
    update t set f01=f01*2 where id=2; 
when any do
   begin
     gds=gdscode;
     suspend;
     exception;
   end
end
^set term ;^
select * from t;
commit;

 session #1 
SQL> commit;
 
session #2 
         GDS
============
   335544382
Statement failed, SQLSTATE = HY000
cannot update erased record

В трейсе при этом:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
2014-04-15T17:07:39.3220 (12640:0x7fa94341c418) FAILED EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_9192, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:2304
                (TRA_5361520, READ_COMMITTED | REC_VERSION | WAIT 10 | READ_WRITE)

Statement 157907:
-------------------------------------------------------------------------------
execute block returns( gds int ) as
declare x int;
begin
   --select id from t where id=2 for update with lock into x;
   update t set f01=f01*2 where id=2;
when any do
   begin
     gds=gdscode;
     suspend;
     exception;
   end
end

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T NATURAL)
1 records fetched
   2877 ms, 122 fetch(es), 2 mark(s)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T                                       2                   1

2014-04-15T17:07:39.3220 (12640:0x7fa94341c418) ERROR AT JStatement::fetch
        oltp30 (ATT_9192, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:2304
 335544382 : cannot update erased record 

2014-04-15T17:07:39.3280 (12640:0x7fa94341c418) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_9192, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:2304
                (TRA_5361520, READ_COMMITTED | REC_VERSION | WAIT 10 | READ_WRITE)

Statement 157917:
-------------------------------------------------------------------------------
select * from t
. . .


Вопрос. Поскольку в трейсе помимо этой ошибки других нет, то правильно я понимать по-русски, что этот номер: 335544382 - он всегда соответствует именно ЭТОЙ ситуации ?
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615724
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько раз тебе надо повторить, что конкретный номер всегда соответствует конкретному
сообщению, поскольку сообщение из номера и формируется?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615742
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСколько раз тебе надо повторить, что конкретный номер всегда соответствует конкретному
сообщению, поскольку сообщение из номера и формируется?..Объясни мне, колхознику, как могут сформироваться разные сообщения из одного и того же номера блин ?
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615756
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

нет, это ты объясни. Ибо тебе утверждают ровно обратное.
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615762
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrнет, это ты объясни. Ибо тебе утверждают ровно обратное.А, стоп. Не вгляделся я что-то в посыл ДСа... :-)
Ну, тогда всё просто: почему бы не поменять этот самый 'random @1', который сейчас соотв-вует этому коду, на адекватный текст ?
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615798
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидпочему бы не поменять этот самый 'random @1', который сейчас соотв-вует
этому коду, на адекватный текст ?
Потому что для isc_random технически не существует "адекватного текста". Менять надо
isc_random на адекватный gds code. Что произойдёт гораздо быстрее если ты запостишь в
трекер реквест на такую смену для конкретного тесткейса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615824
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

вообще-то в prepare_delete мы видим вызов

Код: sql
1.
IBERROR(188);	// msg 188 cannot update erased record


Который транслируется в

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
void ERR_error(int number)
{
...
	if (gds__msg_lookup(0, JRD_BUGCHK, number, sizeof(errmsg), errmsg, NULL) < 1)
		sprintf(errmsg, "error code %d", number);

	ERR_post(Arg::Gds(isc_random) << Arg::Str(errmsg));
}

Т.е. движок сам ищет сообщение с номером 0x140F0000 + 188 (или 336527548) в своей копии firebird.msg,
достаёт его текст (который и есть "cannot update erased record") и кидает клиенту isc_random с этим текстом.

Понятия не имею, кем и накой это было придумано - все индивидуальные сообщения с facility15 (JRD_BUGCHK)
превращать в безликий isc_random... и при чём тут вообще багчек...
...
Рейтинг: 0 / 0
gds 335544382: всегда ли это "cannot update erased record" ?
    #38615834
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

там вначале ERR_error хороший комментарий есть, единственный вывод из которого - переписать нахрен :-)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / gds 335544382: всегда ли это "cannot update erased record" ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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