[закрыто, говнотема] Вы считаете нормальной ситуацию когда СУБД

pitrik2

не отдает данные?
я ораклист
ни разу не встречал чтобы субд мне не отдавала данные
может у меня опыт маленький просто ...
а щас речь про db2
второй раз уже встречаю такую фигню
первый раз оказалось что ктото незакоммитил данные
сработала блокировка
не вдаваясь в подробности что такое блокировка, как устроена и нафик нужна, вопрос такой:
это нормально что в другом коннекшене нельзя выбрать данные? ладно там изменить, но выбрать?
второй раз только что был
на этот раз не выбирались данные из вьюшки
думала минуту и выдавала какую-то ошибку про ole.dll
оказалось что вьюшка вызывала функции, которые лежали в дополнительной dll и вот эта dll отвалилась
по новой ее зарегистрировали и заработало
правда пришлось еще и индексы пересоздать, они тоже отвалились
хз, почему отвалилась dll, кто в этом виновен, но разве это нормально что субд не сказала в чем трабла?
хотя с какой стати она отвалилась тож интересно, у базы токо один админ, остальные с тонких клиентов лазят и до этого никаких падений не было

katrin2201

Смотря что такое нормально в твоем понятии.
Если нормально == удобно, то ситуация ненормальна.
Если нормально == бывает в реальной жизни, то, к сожалению, нормальна.

kruzer25

Если нормально == бывает в реальной жизни, то, к сожалению, нормальна.
Это именно для db2?
Потому что в постгресе я как-то не могу понять, как такое может произойти..

pitrik2

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

pitrik2

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

kruzer25

запрос который будет выполняться слишком долгое время
Я так понял, у автора треда проблема не в том, что слишком долго чего-то выполняется, а в том, что его просто отпинывают?
ЗЫ: О, придумал, когда такое может быть - при превышении максимального числа коннектов

0000

Че значит не отдает? Oracle вообще то может то же типа не отдавать

select * from test for update

Второй запуск уже буш ждать, когда первый закончится.
Имхо нормальная ситуация для многопользовательской БД.

pitrik2

нет
не так
я наверна плохо объяснил
происходит вот что:
в первом случае так:
делаю select
жду
жду
жду
отваливается операция по таймауту
во втором так:
делаю select
жду
жду
жду
отваливается операция с ошибкой в ole.dll, при том что эта ole хз что такое
при превышении коннектов мне выдается ошибка: превышено число коннектов
тоесть поведение адекватное

pitrik2

Второй запуск уже буш ждать, когда первый закончится.
с каких это щей то?
запускаем
select * from test for update 

запускаем второй запуск
select * from test 

все данные нормуль выбираются!

0000

Я и не говорил, что не будет выбираться

select * from test

Я написал к тому, что по разному работают блокировки. В одной из книг прям с пафосом было написано - Oracle это ништяк система, пока одна транзакиция меняет данные другая может ее не ждать и читать старье, т.е. это не стандартное поведение БД. С for update запросы эмулируют БД с блокировкой таблицы при ее изменении.

pitrik2

пока одна транзакиция меняет данные другая может ее не ждать и читать старье, т.е. это не стандартное поведение БД
оппа
а я как раз считаю что это стандартное поведение субд
тэкс, где взять определение стандарта СУБД?

0000

В стандарте SQL видимо, тока этот стандарт все забивают и делают как считают нужным (в том числе и Oracle).

pitrik2

читаю вот это
офигеваю все больше и больше
предложили решение проблемы:
попробуй select * from table with ur
и дальше такая приписка:
Только не забывай Commit/Rollback после select * from table with ur
Иногда with ur локирует catalog tables! Причем именно иногда!
From IBM doc - "UR isolation acquires almost no locks "

0000

Лучше иди покури организацию блокировок в DB2
Том Кайт не зря акцентирует свое внимание, что разрабы зачастую переносят свои привычки с одной системы на другую с печальным результатом.
P.S. Читал как то про блокировки в MS SQL - то же веселая песня

pitrik2

В стандарте SQL видимо, тока этот стандарт все забивают и делают как считают нужным (в том числе и Oracle).
там нет того что ты утверждаешь
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
более того
там есть "намеки" на то что ты неправ
это намеки, потому что про запрет чтения там ничего нет, но есть про то что будет читаться если будет читаться
в оракле как раз читается и как раз то что по стандарту
The isolation level of a SQL-transaction is SERIALIZABLE by default.
для SERIALIZABLE P1: Not Possible

0000

Сорри, похоже облажался Надо целиком поботать уровни блокировок.

pitrik2

почитал еще
в вики есть определение субд
вполне корректное вроде
условие токо одно: P1: база не должна выдать испорченные данные
в оракле достигается тем что выдаются неиспорченные данные
в дб2 достигается тем что не выдаются никакие
определению субд оба не противоречат
так что возвращаемся к первоначальному вопросу: вы считаете нормальным путь дб2?

kruzer25

вы считаете нормальным путь дб2?
Ну как бы это зависит от.
Например, если тебе нужно гарантированно получить данные - это плохой путь.
А если тебе нужно гарантированно в течение 0.1с ответить клиенту - это хороший путь.
Но пусть того же постгреса, в общем-то, может быть модифицирован в путь дб2 - если ждём больше 0.1с, считаем, что ответа не будет.

krishtaf

почитай дейта
он, сцука, причастен к дб2

bleyman

А ты представляешь, как такое поведение (неблокирующийся select во время update) реализовано?
Я вот не знаю, но у меня есть два варианта:
1) изменённые/добавленные/удалённые версии строк накапливаются в Отдельном Месте в специально заточенном быстром формате, после выполнения запроса таблицы всё-таки блокируются и в них всё переписывается. Выгода получается только в случае каких-нибудь сложных запросов с процедурами, наверное.
2) Или Отдельное Место тесно интегрировано с самой таблицей, фактически, каждая строчка может присутствовать в двойном экземпляре, но проход по таблице хитроумно и централизованно направляется тем или иным образом, а после завершения апдейта и всех pending селектов он направляется другим образом и в бэкграунде удаляется всё лишнее. Бррр.
А необходимость этого всего довольно неочевидна. Зачем тебе долгий апдейт? Или я чего-то не понимаю?

Hastya

Уровни изоляции настрой. Это кстати стандартная ошибка всех ораклистов, работающих с ДБ2. А потом возникают легенды по этому поводу...

tokuchu

Я не работал с Oracle и DB2, только читал немного про транзакции в постгресе. Но есть большое подозрение, что это поведение настраивается.

daru

А ты представляешь, как такое поведение (неблокирующийся select во время update) реализовано?
В oracle это реализовано через сегмент отката сегмент отката.
Аффтору треда и сопереживающим: надо ботать что такое ACID, уровни изоляции транзакций и историю хори-вара "версионники vs блокировочники".
Этот бэкграуд imho нужен для эффективного работы с БД...

pitrik2

А необходимость этого всего довольно неочевидна. Зачем тебе долгий апдейт? Или я чего-то не понимаю?
странный вопрос задал
по твоему не бывает долгих транзакций?
некторые операции по работе с базо ймогут минут 10 длиться
а некторые могут и час
и все это в одной транзакции

pitrik2

Аффтору треда и сопереживающим: надо ботать что такое ACID, уровни изоляции транзакций и историю хори-вара "версионники vs блокировочники".
Этот бэкграуд imho нужен для эффективного работы с БД...
да знаю я все это худо бедно
похоже меня сглючило
просто я уже и сам не понимаю про что хотел поговорить
вроде написал в топикстарте что не хочу про конкретные вещи говорить, а вроде тогда не понятно о чем вообще говорить
закрывайте тему

kruzer25

2) Или Отдельное Место тесно интегрировано с самой таблицей, фактически, каждая строчка может присутствовать в двойном экземпляре, но проход по таблице хитроумно и централизованно направляется тем или иным образом, а после завершения апдейта и всех pending селектов он направляется другим образом и в бэкграунде удаляется всё лишнее
Насколько я понимаю, в постгресе как-то так и сделано. Там ещё и версионность какая-то есть.

pitrik2

2) Или Отдельное Место тесно интегрировано с самой таблицей, фактически, каждая строчка может присутствовать в двойном экземпляре, но проход по таблице хитроумно и централизованно направляется тем или иным образом, а после завершения апдейта и всех pending селектов он направляется другим образом и в бэкграунде удаляется всё лишнее
Насколько я понимаю, в постгресе как-то так и сделано. Там ещё и версионность какая-то есть.
насколько я понимаю в процитированном втором пункте написан бред
также насколько я понимаю, в постгресе бреда не должно быть

bleyman

Не, там не бред, мне просто влом чётко расписывать было.
Пусть у тебя каждая строка на самом деле представляет собой два указателя на реальные строки, из которых один может быть нуллом. И глобальный переключатель current. Тогда ты делаешь что-то вроде
DataRow Get(int index)
{
DataRow result = rows[index][current];
if (null == result) result = rows[index][!current];
return result;
}
void Set(int index, DataRow row)
{
if (null == rows[index][current])
{
rows[index][current] = rows[index][!current];
}
rows[index][!current] = row;
}
Когда закончился апдейт и все селекты, инициированные во время него, и все селекты, инициированные во время ожидания, ты смело флипаешь current и все последующие селекты чудесным образом видят уже новую версию. А ты в бэкграунде удаляешь ненужные строки, подготавливая таблицу для следующего апдейта (перекидывать ссылки в нетронутых строчках не нужно, это Set делает сам по мере необходимости).
Плюс обработка отдельно особых случаев для удаления/добавления строк (но это уровнем выше может быть, на самом деле плюс индексы скорее всего придётся таки хранить в двух экземплярах.
Дисклеймер: я это всё только что придумал из головы.

sinet

А если две транзакции будут менять данные, а третья захочет данные прочитать? )
Потом к примеру первая транзакция откатывается, а вторая фиксируется.
Так копий строк на все транзакции не напасёшься.

pitrik2

Не, там не бред, мне просто влом чётко расписывать было.
и?
щас ты четко расписал бред
транзакций одновременных по твоему только две может быть?

kruzer25

А если две транзакции будут менять данные, а третья захочет данные прочитать?
А две транзакции не могут одновременно менять данные.
Если транзакция хочет считать for update/поменять данные, которые уже изменены в другой транзакции - ей придётся подождать коммита/роллбэка.

sinet

Да, говно-пример.
Кучу копий можно наплодить так:
1) Открыть транзакцию читающую данные.
2) Изменить в новой транзакции данные и зафиксировать.
3) Открыть транзакцию читающую данные.
4) Изменить в новой транзакции данные и зафиксировать.
и т.д.
PS Только уровень изоляции транзакций надо поставить SERIALIZABLE.

2mmail2

Попробуй грязное чтение (тег nolock)

pitrik2

Попробуй грязное чтение (тег nolock)
эххх
что за люди
покажи мне где я спрашивал как мне это сделать?
зачем отвечать на вопрос который не задавали?
чтобы выпендриться?
Оставить комментарий
Имя или ник:
Комментарий: