Уровни изоляции в Юконе

zVlad
Уже с Приветом
Posts: 16196
Joined: 30 Apr 2003 16:43

Post by zVlad »

tengiz wrote:
zVlad wrote:Tengiz! Положа руку на сердце скажите: есть нынче, на уровне SQL 2000 неразрешимые проблемы конкурентного доступа?..........

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

Для опытного разработчика приложений неразрешимых проблем нет :).

Если серьёзно - а Вы разве забыли, что своей популярностью реляционные СУБД и SQL обязаны тем, что системы предыдущих поколений были значительно менее удобны для прикладных программистов? Почему Вы полагаете, что движение в сторону удобства и логичной простоты без ущерба для функциональности и производительности должно почему-то прекратиться?

Даже если проблема оптимальной изоляции транзакций снимется с повестки дня для самого широкого спректра приложений (давайте помечтаем - например, СУБД будут иметь только два надёжных и качественных режима работы каким-то ещё чудом обеспечивающих максимальную параллельность - serializable и readonly), не переживайте - без интересной и уважаемой работы не окажетесь: для DBA и опытных разработчиков приложений баз данных всё равно остаётся огромная область приложения ума и сил помимо шаманства вокруг изоляции транзакций - оптимально построенные модели данных, аккуратно спроектированные и написанные запросы, тонкая настройка производительности приложений, оптимальное индексирование и пр.


По порядку:
1. "....Если серьёзно - а Вы разве забыли, что своей популярностью реляционные СУБД и SQL обязаны тем, что системы предыдущих поколений были значительно менее удобны для прикладных программистов?"
Нет не забыл. Потому что уже давно (скорее никогда) в эту сказку не верю. А Вы ни разу не видели мук программистов переходящих скажем с "удобств" IDMS на "удобства" RDBMS?
Есть два-три поинта почему RDBMS завоевали рынок, например, производительность труда программера - т.е. сколько с него можно выдоить за единицу времени, или модифицируемость приложения. Но никак не "удобства".

В рамках же обсуждаемой темы я вижу один лишь поинт зачем Microsoft это (snapshot) понадобилось - чтобы упростить перевод приложений с Оракл на SQL Server. Разве не так?

2. "...давайте помечтаем - например, СУБД будут иметь только два надёжных и качественных режима работы каким-то ещё чудом обеспечивающих максимальную параллельность - serializable и readonly".

Вы многократно и очень убедительно доказывали, что serialazable - есть только цель достойная достижения в теоритическом смысле. Как коммунизм в теории развития общества. Но если коммунизм, по разным причинам, оказался на данном этапе не возможен, то в нашем случае, и без чудес, а просто используя адекватные по мощности сервера и другие компоненты системы можно уже сегодня переводить приложения в режим serializable, обеспечивающий требуемую параллельность.
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

tengiz wrote:
Dmitry67 wrote:Пока вот какой минус. Конечно работал я мало... но... c интерфейсом надо чтото делать То что раньше занимало один клик, теперь целаю проблема.

Спасибо за Ваше частное мнение :)

Об интерфейсе чего идёт речь? Единственный интерфейс, с которым я сталкиваюсь - это setup, SQL Workbench, и BOL - я больше ничего никогда не включал ввиду сцепифики ядра сервера. Что касается setup - то по-моему там всё достаточно просто. SQL Workbench сначала бесит почти всех (дайте взад наш QA!), но потом, после того, как немного освоишься (через неделю-другую), обратно на QA уже не перетащишь. Тоже почти всех.


Я имел ввиду Workbench.
Пытаешься удалить таблицу. Было как ? Клик, delete, OK, все
Теперь - окно с глюкалками запускается, этапы процесса удаления показывает... Правда более одной таблицы за раз не выбрать и после удаления список таблиц не рефрешится...
Квери незаконнекченные которые при попытке запуска просят себя законеектить... Все это замечательно, но как только законнектился - она начинает выполняться по master...
Вот пока что всбесило
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

zVlad wrote: В рамках же обсуждаемой темы я вижу один лишь поинт зачем Microsoft это (snapshot) понадобилось - чтобы упростить перевод приложений с Оракл на SQL Server. Разве не так?

Вы многократно и очень убедительно доказывали, что serialazable - есть только цель достойная достижения в теоритическом смысле. Как коммунизм в теории развития общества. Но если коммунизм, по разным причинам, оказался на данном этапе не возможен, то в нашем случае, и без чудес, а просто используя адекватные по мощности сервера и другие компоненты системы можно уже сегодня переводить приложения в режим serializable, обеспечивающий требуемую параллельность.


Я так понимаю, проблема в том, что из "большой тройки" только у DB2 теперь нет версионности и стоит задача доказать, что версионность никому не нужна ? :)

Как зелен виноград! - лиса здохнула, не в силах дотянуться до плодов. (c)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
zVlad
Уже с Приветом
Posts: 16196
Joined: 30 Apr 2003 16:43

Post by zVlad »

Dmitry67 wrote:
zVlad wrote: В рамках же обсуждаемой темы я вижу один лишь поинт зачем Microsoft это (snapshot) понадобилось - чтобы упростить перевод приложений с Оракл на SQL Server. Разве не так?

Вы многократно и очень убедительно доказывали, что serialazable - есть только цель достойная достижения в теоритическом смысле. Как коммунизм в теории развития общества. Но если коммунизм, по разным причинам, оказался на данном этапе не возможен, то в нашем случае, и без чудес, а просто используя адекватные по мощности сервера и другие компоненты системы можно уже сегодня переводить приложения в режим serializable, обеспечивающий требуемую параллельность.


Я так понимаю, проблема в том, что из "большой тройки" только у DB2 теперь нет версионности и стоит задача доказать, что версионность никому не нужна ? :)

Как зелен виноград! - лиса здохнула, не в силах дотянуться до плодов. (c)


1. Наверняка в ИБМ велось и ведется изучение версионности. Возможно существование исследовательского версионного варианта ИБМ RDBMS.

2. Не исключаю, хотя и не понимаю зачем бы это было нужно (разве для облегчения перевода приложений с Оракл на DB2) что в очередной версии DB2 версионность появится.

3. Что касается нужности или не нужности версионности. Попробуйте провести опрос среди прикладных программеров. Вы узнаете что 80-90% даже не в курсе существования уровней как таковых. Так что доказывать или опровергать нужность или ненужность того о существовании чего большинство участников процесса даже не подозревают - совершенно бессмысленное занятие.
Кстати, интересен вопрос: как можно ощутить, измерить (потрогать) наличие (или отсутствие) версионности, если приложение написано исходя из принципов блокировочника? Не даст ли в этом случае версионность негативного эффекта?
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Merle,

Я не могу ответить на все Ваши вопросы - я не уверен, что всё, что Вы спрашиваете планируется сделать доступным публике. Вот ответы на часть из них:
как вообще происходит очистка устаревших версий? Это какой-то процесс который запускается по расписанию?
Примерно также как и происходит отработка контрольных точек (checkpoints)- по времени или по необходимости, если нет места в tempdb. Нагрузка учитывается - через отслеживание наличия активных транзакций, которым требуются версии.

Как именно происходит копирование старых версий из базы в tempdb? Может ли возникнуть ситуация при которой пишущая транзакция уже захватила запись на изменение, но зафиксированной копии в tempdb еще не появилось? Как я понял из документации обязанность класть копию записи в tempdb возлагается на изменяющую транзакцию?
Копирование старой версии строки происходит в момент изменения строки. Наложение X блокировки ещё ничего не создаёт. Если в этот момент (после наложения блокировки но до фактического изменения) другой транзакции на версионном уровне изоляции понадобилось прочитать это строку, то строка будет прочитана безотносительно к блокировке.

не вступают ли в конфликт методы оптимизации для версионности и методы оптимизации необходимые для работы с временными таблицами? Не станет ли работа с временными таблицами из-за этого более тяжелой?
Нет, не вступают. Нет, не станет.
Cheers
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Dmitry67 wrote:Я имел ввиду Workbench...

Ну тут уже я пас - я SQL Workbench использую только как более удобную функциональную замену QA. Типа такой Visual SQL Studio. Когда выйдет вторая бета и появятся открытые usenet конференции по поводу Yukon B2 - приглашаю Вас принять в них активное участие и высказать все замечания и предложения. За этими usenet группами будут внимательно следить как люди из поддержки, так и разработчики.
Cheers
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

zVlad wrote:Что касается нужности или не нужности версионности. Попробуйте провести опрос среди прикладных программеров. Вы узнаете что 80-90% даже не в курсе существования уровней как таковых. Так что доказывать или опровергать нужность или ненужность того о существовании чего большинство участников процесса даже не подозревают - совершенно бессмысленное занятие.

Именно. То, что большинство разработчиков не в курсе существования уровней изоляции совершенно не означает, что они появились зря. То же самое с версионностью. Её наличие только добавляет причин не знать о том, что такой зверь вообще бывает. Идеально - нужно только два режима работы - полная изоляция, и полная изоляция + readonly. Как только появится удовлетворительное по скорости более-менее универсальное алгоритмическое решение для обеспечения идеальной сериализуемости, понятие уровней изоляции просто исчезнет.
Кстати, интересен вопрос: как можно ощутить, измерить (потрогать) наличие (или отсутствие) версионности, если приложение написано исходя из принципов блокировочника? Не даст ли в этом случае версионность негативного эффекта?

Конечно, есть масса ситуаций, когда приложение, правильно работающее на блокировочном уровне изоляции, будет работать иначе на аналогичном версионном уровне изоляции. Причём "иначе" - не всегда означает "правильно". Некоторые варианты неправильного поведения мы как раз и рассматривали в последней дискуссии о write consistency в Oracle. SQL Server или DB2 в большинстве похожих ситуаций, на том же уровне изоляции отработают безупречно. Т.е. кое-какие вещи при переходе на версионность придётся переделать, иначе будут ошибки.
Cheers
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

=)Чертовски приятно, что Вы хоть на часть вопросов можете ответить и, что самое главное, отвечаете... =)
tengiz wrote:Копирование старой версии строки происходит в момент изменения строки. Наложение X блокировки ещё ничего не создаёт. Если в этот момент (после наложения блокировки но до фактического изменения) другой транзакции на версионном уровне изоляции понадобилось прочитать это строку, то строка будет прочитана безотносительно к блокировке.

А каким образом версионный скан догадывается какую именно строку надо смотреть в tempdb, если она к тому времени в основной базе уже заблокирована и изменена.
14 байтный кусочек с меткой транзакции и ссылкой остается по прежнему доступным?
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Merle wrote:А каким образом версионный скан догадывается какую именно строку надо смотреть в tempdb, если она к тому времени в основной базе уже заблокирована и изменена. 14 байтный кусочек с меткой транзакции и ссылкой остается по прежнему доступным?

Да, но дело не в том, что метка транзакции и ссылка доступны. На самом деле доступна вся строка, потому что блокировка - это способ обеспечить логическую, а не физическую целостность транзакции. Поэтому даже если заблокированная строка будет сервером прочитана, но не будет выдана пользователю или если на основе видимой пользователю информации не будет сделано других видимых пользователю изменений в базе данных, но никаких проблем с этим нет. Метка транзакции и ссылка - это невидимая для пользователя служебная информация, которая может быть считана сервером для своих нужд в любой момент из любой строки под кратковременной блокировкой (latch).
Cheers
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Кстати просто для истории
В Btrieve еще очень давно тоже была версионность, я бы назвал эту базу 'двухверсионником'
Она хранила dirty data так, что readers читали только committed data.
При update одной и той же страницы возникала блокировка.

Потом на основе Btrieve был сделан NetWare SQL, переименованный в Perversive :) SQL, кстати, кто знает его судьбу ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

Dmitry67 wrote:Потом на основе Btrieve был сделан NetWare SQL, переименованный в Perversive :) SQL, кстати, кто знает его судьбу ?

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

Tengiz, скажите, а в новой базе в Юконе имена всех разработчиков новой версии есть? :)
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Merle wrote:Tengiz, скажите, а в новой базе в Юконе имена всех разработчиков новой версии есть? :)

Это Вы про AdventureWorks спрашиваете? Любые совпадения случайны и к реальным людям отношения не имеют :) - все вопросы к группам User Education и Documentaion.
Cheers
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

tengiz, а вот по поводу рекурсивных кверей
я про
with () select

Во превых я не понял зачем это. Если без рекурсии, то тоже самое (и больше) делают inline view

Для рекурсии я нашел только примеры BOL с двумя таблицами. А вот для самосвязанной таблицы как построить не понимаю

Например

create table Docs(ID int identity, Folder int)
Folder -> ref to Docs.ID
Root: Folder is NULL
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

Dmitry67 wrote:tengiz, а вот по поводу рекурсивных кверей
я про
with () select

Во превых я не понял зачем это. Если без рекурсии, то тоже самое (и больше) делают inline view

А как с inline view? Вообще with() - это кажется стандарт....

Для рекурсии я нашел только примеры BOL с двумя таблицами. А вот для самосвязанной таблицы как построить не понимаю[/quote]
Вот в этой статье есть еще примеры:http://msdn.microsoft.com/library/en-us/dnsql90/html/sql_YukonTSQLEnhance.asp
Merle
Уже с Приветом
Posts: 109
Joined: 26 Sep 2002 12:24

Post by Merle »

tengiz wrote:все вопросы к группам User Education и Documentaion.

Ага, добраться бы до них.. :)

Скажите, а как наиболее адекватно перевести термины snapshot isolation framework и version store heaps?
Ну и далее немного уточнений.. =)
А что из себя представляет snapshot isolation framework? Это сервис, процесс, механизм или просто режим работы сервера с базой?
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

Dmitry67 wrote:tengiz, а вот по поводу рекурсивных кверей
я про
with () select

Во превых я не понял зачем это. Если без рекурсии, то тоже самое (и больше) делают inline view

Для рекурсии я нашел только примеры BOL с двумя таблицами. А вот для самосвязанной таблицы как построить не понимаю

Например

create table Docs(ID int identity, Folder int)
Folder -> ref to Docs.ID
Root: Folder is NULL


Code: Select all

drop table docs;
create table Docs(ID int , Folder int);
insert into docs values(1,0);
insert into docs values(2,1);
insert into docs values(3,1);
insert into docs values(4,1);
insert into docs values(5,2);
insert into docs values(6,5);
insert into docs values(7,3);
insert into docs values(8,3);
insert into docs values(9,4);
insert into docs values(10,2);


select * from docs

ID          Folder
----------- -----------
          1           0
          2           1
          3           1
          4           1
          5           2
          6           5
          7           3
          8           3
          9           4
         10           2

 with d2(id, folder, level) as (
     select id, folder, 0 as level
     from docs
     where folder=0
    union all
     select d1.id, d1.folder, level+1
     from docs d1 join d2 on d1.folder=d2.id
 )
 select * from d2

id          folder      level
----------- ----------- -----------
          1           0           0
          2           1           1
          3           1           1
          4           1           1
          9           4           2
          7           3           2
          8           3           2
          5           2           2
         10           2           2
          6           5           3

(10 rows affected)
1>


Rgds.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

<..dup...>
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Я понял
Проблема в том что Вы пишете Folder=0 и получаете все дерево
Вся замечатлеьно
Можно также написать для какого то узла, Folder=@var

Но я то думал что есть способ сделать что нибудь в духе

with d2 (...)
slect * from SomeFolderList, d2 where dé.Folder=SomeFolderList.Folder

то есть каждый раз начинать от нового корня...
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

Dmitry67 wrote:Я понял
Проблема в том что Вы пишете Folder=0 и получаете все дерево
Вся замечатлеьно
Можно также написать для какого то узла, Folder=@var

Но я то думал что есть способ сделать что нибудь в духе

with d2 (...)
slect * from SomeFolderList, d2 where dé.Folder=SomeFolderList.Folder

то есть каждый раз начинать от нового корня...


What's wrong with:

Code: Select all

 with d2(id, folder, level) as ( 
     select id, folder, 0 as level
     from docs
     where folder in (2,3)
    union all
     select d1.id, d1.folder, level+1
     from docs d1 join d2 on d1.folder=d2.id
 )
 select * from d2

5   2   0
7   3   0
8   3   0
10   2   0
6   5   1


???

Rgds.
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Merle wrote:Скажите, а как наиболее адекватно перевести термины snapshot isolation framework и version store heaps?

К сожалению, я не знаю ни устойчивой русской терминологии, ни русского технического жаргона в этой подтеме. Прямой перевод - думаю знаете сами.

А что из себя представляет snapshot isolation framework? Это сервис, процесс, механизм или просто режим работы сервера с базой?

Это набор алоритмов, реализующий их код и структуры данных в Storage Engine, которые обеспечивает shapsot isolation. Это не сервис, не процесс, а действительно режим работы в Access Methods. Объём кода для его реализации небольшой - благодаря качественному основанию, которое уже имелось. Реализованный алгоритм - один из самых прямолинейно простых и ясных для понимания вариантов мультиверсионности. Никаких изысков.
Cheers
Alex Shtern
Posts: 9
Joined: 14 Oct 2004 19:24
Location: CA

Post by Alex Shtern »

Очень интересный topic, пожалуй один из самых интересных на етом форуме ...

Из того что здесь написано, выглядит что Yukon SI больше напоминает
Interbase/FireBird row versioning - только у них old row versions
хранятса прямо в data blocks и вообше нет Redo Log -
hot backup делают через row versioning :-)

Правда соответственно у них нет и point-in-time recovery.

Вообше то, хоть ето и не тема топика но у меня есть
один коментарий к тому что сказал tengiz об Oracle.

Правда что строки не имеют метки последней транзакции, метку транзакции имеет сама страница, но в странице на самом деле есть такая штука
как ITL interested transactions list и там записаны
ВСЕ uncommited (и может быть кое какие commited - ето зависит от initrans)
транзакции, которые модифицируют данные на етой странице а каждая модифицированная row has byte with transaction slot number in the ITL -
так что Oracle всегда знает какие rows in data page has been modified.
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

Alex Shtern wrote:Правда что строки не имеют метки последней транзакции, метку транзакции имеет сама страница, но в странице на самом деле есть такая штука как ITL interested transactions list и там записаны ВСЕ uncommited (и может быть кое какие commited - ето зависит от initrans) ранзакции, которые модифицируют данные на етой странице а каждая модифицированная row has byte with transaction slot number in the ITL - так что Oracle всегда знает какие rows in data page has been modified.

Alex, когдя я написал, что в Oracle "строки не имеют метки последней транзакции, метку транзакции имеет сама страница, также есть внутристраничный кеш с некоторой информацией о последних транзакциях (глубина этой мини-истории - настраиваемый параметр)" именно ITL я и имел в виду. Однако ввиду ограниченной глубины этой истории при интенсивном обновлении страницы "Oracle не всегда может точно определить есть ли нужная версия строки на текущей странице" по причине того, что для читающей транзакции одинаково важно иметь информацию как об активных тразнакциях, модифицирующих страницу (информация о всех из них действительно имеется в ITL - , кстати, это одно из узких мест Oracle - жёсткое ограничение на количество активных транзакций модифицирующих конкретную страницу), так и о зафиксированных до того, как читающая транзакция началась (а вот этого уже никто не гарантирует).
Cheers
Alex Shtern
Posts: 9
Joined: 14 Oct 2004 19:24
Location: CA

Post by Alex Shtern »

Ok tengiz,

Ето все ето чистая правда с точки зрения теории баз данных.

к тому же с удовольствием прочитал те главы из
CONCURRENCY CONTROL AND RECOVERY IN DATABASE SYSTEMS
которые ты где то советовал ...

Да, в Oracle, только до 255 трансакзий могут одновремено
модифицировать страницы в 8-32кб. страницы в 2 и 4 кб редко
кто использует ..

Ну скажем на практике, 2 года назад я учацтвовал в benchmark в
Sun Labs (Oregon) на Sun Fire 15K
with 106 CPUs и видел, как то раз, 16 активных трансакзий на block.

Ну и к тому же в Oracle 10g добавилась такая вещь как
guaranteed undo retention которая решит большую часть реально
связанных с етим проблем, пусть и за счет болшего количества
disk space, чем ето сделано в Yukon.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

Alex Shtern wrote:....

Правда что строки не имеют метки последней транзакции, метку транзакции имеет сама страница, но в странице на самом деле есть такая штука
как ITL interested transactions list и там записаны
ВСЕ uncommited (и может быть кое какие commited - ето зависит от initrans)
транзакции, которые модифицируют данные на етой странице а каждая модифицированная row has byte with transaction slot number in the ITL -
так что Oracle всегда знает какие rows in data page has been modified.


This is incorrect. Oracle timestamps the entire block, not individual rows so the block has to be reconstructed as a whole. ITLs do not contain information about all the rows, they contain information about transactions modifying the block. Besides, there are fewer ITLs (usually) in the block than there are rows.

VC
Alex Shtern
Posts: 9
Joined: 14 Oct 2004 19:24
Location: CA

Post by Alex Shtern »

VC,

ITLs do not contain information about all the rows but each row header for
locked row contains byte - this byte is a number of Interester Transaction Slot
in the ITL . :lol:

И если бы ты прочитал прошлое сообшение, то увидел бы
что именно ето там и написано :umnik1:

Return to “Вопросы и новости IT”