Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
т.е. ISOLATION LEVEL SNAPSHOT?

или версионность не приживается на SQL Server?
9 дек 12, 14:37    [13602358]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Используют.
Что послужило причиной такого вопроса?
9 дек 12, 14:54    [13602386]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
invm
Используют.
Что послужило причиной такого вопроса?


Мое неуемное желание использовать версионность в своей базу, чтобы избавиться от длинных блокировок,
не всегда нужных.
Т.е. скажем, юзеры выполня.т одну и ту же процедуру, делающую инсерты и апдейты, причем разных записей, и вставку записей с разными ключами. Сейчас получается, чот при открытии транзакции в процедуре вторая процедура ждет ее завершения, потмо работает сама. Но на больших базах это накладно..

Вот и хотел узнать мнение и отзывы, как работает версионность в SQL Server.
9 дек 12, 15:11    [13602404]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
желание использовать версионность в своей базу, чтобы избавиться от длинных блокировок
...
юзеры выполня.т одну и ту же процедуру, делающую инсерты и апдейты, причем разных записей, и вставку записей с разными ключами.


Версионность тут ни при чём. SQL Server без всякой версионности умеет делать параллельные инсерты и апдейты записей с разными ключами. Вы мониторили, по каким ресурсам идёт ожидание блокировок? Может, у вас банальная эскалация, или serializable транзакции, или ещё что-нибудь, не связанное с версионностью/неверсионностью.
9 дек 12, 15:22    [13602423]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
или индексация кривая
или мерж реплики или аналогичные решения применены
9 дек 12, 15:30    [13602432]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
P.S.

версионность прекрасно решает проблемы одновременной работы читателей и писателей
но не писателей с писателями
если вы понимаете о чем я
9 дек 12, 15:42    [13602452]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
желание использовать версионность в своей базу, чтобы избавиться от длинных блокировок
...
юзеры выполня.т одну и ту же процедуру, делающую инсерты и апдейты, причем разных записей, и вставку записей с разными ключами.


Версионность тут ни при чём. SQL Server без всякой версионности умеет делать параллельные инсерты и апдейты записей с разными ключами. Вы мониторили, по каким ресурсам идёт ожидание блокировок? Может, у вас банальная эскалация, или serializable транзакции, или ещё что-нибудь, не связанное с версионностью/неверсионностью.


0. простой эксперимент

/*
drop table test;

create table test
(
id integer not null primary key,
name varchar(256)
);

*/

1.

begin transaction;
    insert into test (id, name) values(2,'new2');
    select * from test; --                              (1)
    rollback;               --                              (2)


2.
 begin transaction;
    insert into test (id, name) values(1,'new1');
    select * from test;
  commit;



Выполняю скрипт 1 до точки (1)
Потом скрипт 2 полностью - он ждет
Потом в скрипте 1 делаю коммит или роллбек
После этого 2 завершается.
9 дек 12, 15:47    [13602463]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh,

Ну естественно, у вас же пересекаются ресурсы по id = 2. Уберите селекты, или делайте выборку "select * from test where id = 1", и никаких ожиданий не будет.

Чтобы решить вашу проблему, достаточно включить на базе READ COMMITTED SNAPSHOT. Вполне себе работает, хоть на N-терабайтных базах. Улучшение concurrency и уменьшение числа deadlock'ов видно невооружённым взглядом. Правда, и нагрузка на tempdb возрастает.
9 дек 12, 15:54    [13602477]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

Ну естественно, у вас же пересекаются ресурсы по id = 2. Уберите селекты, или делайте выборку "select * from test where id = 1", и никаких ожиданий не будет.

Чтобы решить вашу проблему, достаточно включить на базе READ COMMITTED SNAPSHOT. Вполне себе работает, хоть на N-терабайтных базах. Улучшение concurrency и уменьшение числа deadlock'ов видно невооружённым взглядом. Правда, и нагрузка на tempdb возрастает.


кстати, по поводу темпдб: версии хранятся там, а как же быть с тем, что на рестарте сервера темпдб практически пересоздается?
Т.е. все остается там?
9 дек 12, 16:18    [13602536]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37052
Winnipuh
кстати, по поводу темпдб: версии хранятся там, а как же быть с тем, что на рестарте сервера темпдб практически пересоздается?
Т.е. все остается там?
Почитайте, что ли, как версии устроены, для чего и в какой момент они нужны. Тогда такие вопросы возникать не будут.

Сообщение было отредактировано: 9 дек 12, 16:30
9 дек 12, 16:30    [13602550]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh,

Версии строк нужны, чтобы внутри транзакции можно было прочитать данные, согласованные на начало транзакции. Поскольку после рестарта сервера активных транзакций нет, то и версии не нужны. Поэтому tempdb точно так же пересоздаётся.
9 дек 12, 16:31    [13602554]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

Версии строк нужны, чтобы внутри транзакции можно было прочитать данные, согласованные на начало транзакции. Поскольку после рестарта сервера активных транзакций нет, то и версии не нужны. Поэтому tempdb точно так же пересоздаётся.


спасибо..

Вот нашел интересное примечание:

автор
Иными словами, в отсутствии индексов Yukon осуществляет поиск по таблице как самый обычный блокировочник, даже при уровне изоляции snapshot. Версионник в данной ситуации сначала сканирует всю таблицу обычным версионным запросом, выясняя нужные записи, а потом обращается с обновлением только к тем, которые подходят под условие выборки, поэтому подобного там не происходит.

Yukon же сканирует таблицу, накладывая блокировку обновления на каждую запись, и снимая ее, если запись не удовлетворяет условию выборки, или конвертируя в эксклюзивную, если удовлетворяет.

Таким образом, даже если заблокированная запись не удовлетворяет условию выборки обновляющего оператора snapshot-транзакции, в случае отсутствия индексов транзакция все равно застрянет на блокировке.
9 дек 12, 17:13    [13602670]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Crimean
P.S.

версионность прекрасно решает проблемы одновременной работы читателей и писателей
но не писателей с писателями
если вы понимаете о чем я


пытаюсь
9 дек 12, 17:22    [13602693]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
Вот нашел интересное примечание:

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

А вы проверьте на вашем @@version. Я попытался воспроизвести указанное поведение на 2008R2, но у меня не получилось — никаких ожиданий я не увидел, апдейт "UPDATE tst SET y=-1 WHERE x=4 " прошёл успешно. Все скрипты брал из статьи. Видимо, описанное поведение было характерно для бета-версий 2005.
9 дек 12, 17:30    [13602718]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh,

+только что проверил на SQL2005 (Microsoft SQL Server 2005 - 9.00.5057.00 (X64) Mar 25 2011 13:33:31) — тоже не увидел указанной блокировки.
9 дек 12, 17:32    [13602724]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

+только что проверил на SQL2005 (Microsoft SQL Server 2005 - 9.00.5057.00 (X64) Mar 25 2011 13:33:31) — тоже не увидел указанной блокировки.


у меня сейчас 2012 Девелопер Ед.
9 дек 12, 17:44    [13602760]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
Вот нашел интересное примечание:

пропущено...

А вы проверьте на вашем @@version. Я попытался воспроизвести указанное поведение на 2008R2, но у меня не получилось — никаких ожиданий я не увидел, апдейт "UPDATE tst SET y=-1 WHERE x=4 " прошёл успешно. Все скрипты брал из статьи. Видимо, описанное поведение было характерно для бета-версий 2005.


автор
Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


Сделал так:

1. 
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
    UPDATE test1 SET name = N'name 333' WHERE id = 2 
--------------------------(1)
COMMIT TRAN

2. 
BEGIN TRAN
    UPDATE test1 SET name = N'name 444' WHERE id = 2 
-------------------(1)
COMMIT TRAN



Выполнил 1 до (1)
Затем 2 полностью, он подвис в ожидании
Потом 1 - коммит
2 завершился.


А если сначала 2 до (1)
Потом 1 полностью - он подвисает и ждет,
затем делаю 2 - коммит
и первый завершается так

автор
Msg 3960, Level 16, State 2, Line 3
Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table 'dbo.test1' directly or indirectly in database 'mam950_test' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement.
9 дек 12, 17:58    [13602792]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh,

Ну всё правильно, пересечение ресурсов по id=2. Ошибка 3960 и в цитируемой статье описана. По-другому тут быть не может, хоть в бета-версии, хоть в любом сервис-паке :)
9 дек 12, 18:08    [13602826]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

Ну всё правильно, пересечение ресурсов по id=2. Ошибка 3960 и в цитируемой статье описана. По-другому тут быть не может, хоть в бета-версии, хоть в любом сервис-паке :)


вы меня сбили с толку, я думал у вас не повторяется

зы. кстати постгрес ошибку не дает в таком случае, отрабатывает...
9 дек 12, 18:10    [13602829]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh
вы меня сбили с толку, я думал у вас не повторяется

Стоп. Не повторяется у меня другая ситауция, описанная в статье, к которой и относится утверждение "в отсутствии индексов Yukon осуществляет поиск по таблице как самый обычный блокировочник, даже при уровне изоляции snapshot":
автор
Но на самом деле он все равно ведет себя немного «по-блокировочному». Проявляется это, например, все в той же ситуации с отсутствием индексов.

Если еще раз выполнить блокирующую транзакцию, не фиксируя ее:

BEGIN TRAN
UPDATE tst SET y=3 WHERE x=3

А потом попробовать изменить другую запись из snapshot транзакции:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
UPDATE tst SET y=-1 WHERE x=4
COMMIT TRAN

То snapshot транзакция все равно окажется заблокированной.


Тут ресурсы не пересекаются (x=3, x=4), и утверждение "snapshot транзакция все равно окажется заблокированной" — не подтверждается на доступных мне @@version.
9 дек 12, 18:15    [13602839]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
Winnipuh
зы. кстати постгрес ошибку не дает в таком случае, отрабатывает...
А постгресс реультат то какой выдаёт, после одновременного обновления 2-х записей???

Если не будет ошибки, то целостность базы в таком случае нарушается.
9 дек 12, 18:24    [13602878]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh
вы меня сбили с толку, я думал у вас не повторяется

Стоп. Не повторяется у меня другая ситауция, описанная в статье, к которой и относится утверждение "в отсутствии индексов Yukon осуществляет поиск по таблице как самый обычный блокировочник, даже при уровне изоляции snapshot":
автор
Но на самом деле он все равно ведет себя немного «по-блокировочному». Проявляется это, например, все в той же ситуации с отсутствием индексов.

Если еще раз выполнить блокирующую транзакцию, не фиксируя ее:

BEGIN TRAN
UPDATE tst SET y=3 WHERE x=3

А потом попробовать изменить другую запись из snapshot транзакции:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
UPDATE tst SET y=-1 WHERE x=4
COMMIT TRAN

То snapshot транзакция все равно окажется заблокированной.


Тут ресурсы не пересекаются (x=3, x=4), и утверждение "snapshot транзакция все равно окажется заблокированной" — не подтверждается на доступных мне @@version.



да, у меня тоже все прошло.
9 дек 12, 18:30    [13602900]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
alexeyvg
Winnipuh
зы. кстати постгрес ошибку не дает в таком случае, отрабатывает...
А постгресс реультат то какой выдаёт, после одновременного обновления 2-х записей???

Если не будет ошибки, то целостность базы в таком случае нарушается.


постгрес:

1.
begin transaction;
update test set name = 'name1' where id=5;
-------------(1)
commit;

2.
begin transaction;
update test set name = 'name2' where id=5;
commit;


1. 1 до точки (1)
2. 2 полностью, ждет
3. 1 - коммит
4. второй завершается

Результат: 'name2', собственно по факту 2 завершается последним, его и тапки
9 дек 12, 18:36    [13602930]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Winnipuh,

Чтобы в PostgreSQL сделать аналог isolation level snapshot, как я понимаю, нужно сперва выполнить команду "set transaction serializable" (если у вас версия меньше, чем 9.1), либо "set transaction read committed" (если у вас версия 9.1 или выше). Попробуйте повторить эксперимент с указанными уровнями изоляции.
9 дек 12, 18:57    [13602991]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь использует на практике версионность?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость333
Winnipuh,

Чтобы в PostgreSQL сделать аналог isolation level snapshot, как я понимаю, нужно сперва выполнить команду "set transaction serializable" (если у вас версия меньше, чем 9.1), либо "set transaction read committed" (если у вас версия 9.1 или выше). Попробуйте повторить эксперимент с указанными уровнями изоляции.


повторил все, как в предыдущем примере, только во второй добавил в начале

set transaction ISOLATION LEVEL read committed;

Результат тот же, ждет.
9 дек 12, 19:10    [13603015]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить