Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Видимостть версии записи в пределах стейтмента / 22 сообщений из 22, страница 1 из 1
17.10.2016, 17:58
    #39328462
Видимостть версии записи в пределах стейтмента
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table AAA (ID integer not null, NAME varchar(100) not null, SYSDT timestamp default current_timestamp not null);
alter table AAA add constraint PK_AAA primary key (ID);
insert into AAA (ID, NAME) values (1, 'test');
commit work;

SET TERM ^ ;
create or alter procedure AAA$ (ID type of column AAA.ID, NAME type of column AAA.NAME)
returns (OUT_ID type of column AAA.ID) as
begin
  OUT_ID = :ID;
  update AAA T
  set T.NAME = coalesce(:NAME, T.NAME),
      T.SYSDT = current_timestamp
  where T.ID = :OUT_ID;
  suspend;
end^
SET TERM ; ^



теперь, если выполнить:
Код: plsql
1.
2.
3.
select *
from AAA$(1, 'test1') P
left join AAA T on T.id=P.OUT_ID;


- получим старые значения, а не новые. Если же выполнять двумя последовательными запросами (всё, естестественно, в одной транзакции) - то всё ожидаемо.

Не бага ли это?
...
Рейтинг: 0 / 0
17.10.2016, 18:03
    #39328470
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,
во-первых сообщи версию FB. А во-вторых что за странная привычка менять таблицу в селективной ХП?
...
Рейтинг: 0 / 0
17.10.2016, 18:13
    #39328479
Видимостть версии записи в пределах стейтмента
Симонов Денис,
Версия FB естестна текущая, 3.0.1.
Привычки - дело лично. Как и отношение к ним.
...
Рейтинг: 0 / 0
17.10.2016, 18:18
    #39328480
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый никНе бага ли это?
Фича это: стабильность курсора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 18:25
    #39328483
Видимостть версии записи в пределах стейтмента
Симонов Денис,
Обновился до рассвежайшего снепшот-билда 3.0.2.32617-0. На всякий. Всё тоже самое, без изменений.
...
Рейтинг: 0 / 0
17.10.2016, 18:26
    #39328485
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
Hello, Серый-серый Ник!
You wrote on 17 октября 2016 г. 18:25:44:

Серый-серый Ник> Обновился до рассвежайшего снепшот-билда 3.0.2.32617-0. На всякий. Всё тоже самое, без изменений.
релизные ноты чти.
там есть и это.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 18:27
    #39328486
Видимостть версии записи в пределах стейтмента
Dimitry Sibiryakov,
Не всё так просто, вот это работает:
Код: plsql
1.
2.
3.
select null, null,  null from AAA$(1, 'test100500') P
union all
select T.id, T.name, T.sysdt from AAA T where T.id=1;
...
Рейтинг: 0 / 0
17.10.2016, 18:30
    #39328489
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

Проверь на 2.5. По идее стабильность курсора скорее всего влияет.

JOIN c ХП, которая меняет данные не надо делать никогда, ибо это может привести к непредсказуемым результатам, причём в любой версии. Исключением может быть только работа с GTT внутри ХП.
...
Рейтинг: 0 / 0
17.10.2016, 18:37
    #39328493
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

ещё раз повторюсь не делай так никогда. Сейчас left join с помощью nested loop, потом мало ли оптимизатор подточат и он начнёт выполняться с помощью какого-нибудь hash join и весь твой результат накроется медным тазом. Нельзя в SELECT запросах закладываться на последовательность шагов оптимизатора
...
Рейтинг: 0 / 0
17.10.2016, 18:54
    #39328499
Видимостть версии записи в пределах стейтмента
Симонов Денис,
на 2.5.6 всё работает ожидаемо. То есть работает :)
...
Рейтинг: 0 / 0
17.10.2016, 19:03
    #39328503
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

ну значит со стабильностью курсора связано.

серый-серый никна 2.5.6 всё работает ожидаемо.

повторю нельзя такие ожидания строить, потому что работа оптимизатора может поменяться.
...
Рейтинг: 0 / 0
17.10.2016, 19:12
    #39328505
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый никНе всё так просто, вот это работает:
А вот это - баг. Пиши в трекер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.10.2016, 19:18
    #39328508
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
Dimitry Sibiryakov,

у него в ХП suspend есть, который разрывает сейвпойнт. В этом случае стабильность курсора может не работать и это задокументировано. А вот почему так сработало в первом запросе я не понимаю. Если заглянет Влад, тогда может быть и прояснится.
...
Рейтинг: 0 / 0
17.10.2016, 20:16
    #39328523
Видимостть версии записи в пределах стейтмента
Симонов Денисещё раз повторюсь не делай так никогда. Сейчас left join с помощью nested loop, потом мало ли оптимизатор подточат и он начнёт выполняться с помощью какого-нибудь hash join и весь твой результат накроется медным тазом. Нельзя в SELECT запросах закладываться на последовательность шагов оптимизатора
Это всё понятно, но никуда даже к тому времени не денутся:
1. латентность сети
2. необходимость клиенту после изменения обновлять данные с сервера.
Сейчас думать как оно там будет в светлом будущем смысла не вижу. Но надеюсь будет и тогда возможность указать серверу порядок выполнения. Ну а не будет - в execute block придётся заворачивать.
...
Рейтинг: 0 / 0
17.10.2016, 20:58
    #39328531
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

для приведенного примера вполне достаточно UPDATE ... RETURNING
...
Рейтинг: 0 / 0
17.10.2016, 23:00
    #39328569
Видимостть версии записи в пределах стейтмента
Симонов Денис,
Совершенно верно. Только пример естественно упрощённый, и только для иллюстрации ситуации. Никто бы в здравом уме не стал городить такой огород для запроса типа update.
В нашей системе для каждой таблицы создаётся такая проца, которая только и может изменять саму таблицу. Для разграничения прав и уничтожения пользовательских триггеров как класса. Плюсы и минусы такого подхода - не предмет данного топика.
Вопрос же в другом - мы уже вляпались в светлое будущее (3.0 и выше), или таки баг и он поправим?
...
Рейтинг: 0 / 0
17.10.2016, 23:08
    #39328571
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

начиная с 3.0 это ожидаемое поведение. Запрос возвращает содержимое таблицы на момент старта оператора.
...
Рейтинг: 0 / 0
17.10.2016, 23:31
    #39328577
Видимостть версии записи в пределах стейтмента
Симонов Денис,
Ясно. Значит таки вляпались....
Тогда такой вопрос - вариант:
Код: plsql
1.
2.
select * from AAA T 
where T.id = (select P.OUT_ID from AAA$(1, 'test100500') P)


тоже отныне вне закона?
...
Рейтинг: 0 / 0
17.10.2016, 23:43
    #39328582
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

этот вариант ещё более бредовый чем предыдущий. По идее он не должен работать как ты ожидаешь даже в 2.5.
...
Рейтинг: 0 / 0
17.10.2016, 23:49
    #39328585
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
серый-серый ник,

ты конечно можешь найти способ затащить кота в бассейн, но лучше этого не делать.

Легальные способы RETURNING в том числе и на VIEW. ХП возвращающая добавленную/изменённую строку или даже набор строк, тоже самое с помощью EXECUTE BLOCK.

Пытаться изменить что либо с помомщью побочных эффектов селективных ХП не правильно.
...
Рейтинг: 0 / 0
18.10.2016, 22:21
    #39329357
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
Симонов Денису него в ХП suspend есть, который разрывает сейвпойнт. В этом случае стабильность курсора может не работать и это задокументированоПохоже на то. Не проверял.

Симонов ДенисА вот почему так сработало в первом запросе я не понимаю.Я тоже не понимаю - что ты тут называешь "первым запросом" и что осталось не понятным ? :)
...
Рейтинг: 0 / 0
18.10.2016, 22:31
    #39329363
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимостть версии записи в пределах стейтмента
hvlad,

я про 19791795
Здесь получили старые значения. Значит всё отработало как надо, несмотря на наличие suspend
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Видимостть версии записи в пределах стейтмента / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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