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

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: 28294
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: 28294
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: 28294
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

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