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

Откуда: AB
Сообщений: 7600
Приветствую.

есть таблица всего несколько записей.
create table atest(id integer identity primary key, name varchar(100));
в одной сессий открываю транзакцию
begin transaction
update atest set name = 'FFFFFFF' where name = 'FFFFFFF'
во второй:
select * from atest - не блокируется, возвращает все записи.
select * from atest where id > 0  - не блокируется, возвращает все записи.
select * from atest where name .... - блокируется.
если же в первой сделать следующее
update atest set name = 'DDDDDDDDDD' where name = 'FFFFFFF'
, то все приведенные операторы во второй сессии блокируются. Есть этому логическое объяснение?

Сообщение было отредактировано: 15 мар 12, 15:40
15 мар 12, 02:12    [12250056]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7600
В первом случае апдейт происходит (5 row(s) affected), но сами данные не меняются, старые и новые совпадают. Во-втором старые и новые НЕТ.
15 мар 12, 02:16    [12250064]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Очень грубо по памяти (сервера под рукой нет): при чтении с read committed есть у сервера такая оптимизация - если страница не dirty, то не накладывать шаред-локи на записи, расположенные на ней.

О, откопал таки: http://sqlblog.com/blogs/paul_white/archive/2010/11/01/read-committed-shared-locks-and-rollbacks.aspx

Повышайте уровень читающей транзакции, как бы.
15 мар 12, 02:35    [12250085]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7600
Гавриленко Сергей Алексеевич,

Спасибо,

Дык все происходит в режиме по умолчанию, на всем протяжении, без подсказок в запросах.
15 мар 12, 03:00    [12250103]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Опять по памяти, которую проверить не на чем. В скуле много разных интересных оптимизаций. Еще одна оптимизация - это апдейт значения на само себя. Сервер честно накладывает xlock (все равно, что select ... from ... with (xlock) where name = 'FFFFFFF' написать). Но. Поскольку значение реально не изменилось, то, не надо писать об изменении записи в лог (потому что не изменилось ничего), и не надо страницу помечать как dirty (опять же, страница и вправду ни разу не поменялась).

Отсюда ваши спецэффекты.
15 мар 12, 03:12    [12250108]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7600
Гавриленко Сергей Алексеевич,

но если поле "name" попало в "where", страница хоть и не изменилась, но селект стал колом. По-моему перемудрили. Не вижу профита, ну разве что, как вопрос на собеседование:)
15 мар 12, 04:22    [12250149]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Неужели я попал в параллельную вселенную.
Работающий пример в студию (не всегда но часто):
Сессия 1:
USE tempdb
GO
CREATE TABLE dbo.ATest (
	 ID	Int IDENTITY PRIMARY KEY
	,Name	VarChar(100)
);
-- TRUNCATE TABLE dbo.ATest
INSERT	dbo.ATest
SELECT	Convert(VarChar,V.number)
FROM	master.dbo.spt_values V

INSERT	dbo.ATest VALUES ('FFFFFFF')

INSERT	dbo.ATest
SELECT	Convert(VarChar,V.number)
FROM	master.dbo.spt_values V
GO
BEGIN TRAN
	UPDATE	dbo.ATest
	SET	Name = 'FFFFFFF'
--	SET	Name = 'DDDDDDD'
	WHERE	Name = 'FFFFFFF'

-- ROLLBACK
GO
-- DROP TABLE dbo.ATest
Сессия 2:
USE tempdb
GO
SELECT * FROM dbo.ATest
GO
SELECT * FROM dbo.ATest WHERE ID > 0
GO
SELECT * FROM dbo.ATest WHERE Name = 'FFFFFFF'
GO
Притом всё запросы отрабатывают включая последний (WHERE Name ...).
Так что Relic Hunter возможно вы что-то путаете.

Гавриленко Сергей Алексеевич
В скуле много разных интересных оптимизаций. Еще одна оптимизация:
Сервер честно накладывает xlock (все равно, что select ... from ... with (xlock) where name = 'FFFFFFF' написать). Но. Поскольку значение реально не изменилось, то, не надо писать об изменении записи в лог (потому что не изменилось ничего), и не надо страницу помечать как dirty (опять же, страница и вправду ни разу не поменялась).
Мать их. Ладно допусти там всё оптимально и используется - CRC страныцы (а не побитовое сравнение - поубэваубы). Но этот CRC ничего не гарантирует 100%.
Второе - даже это идиотизм. В большей части 99.999(9)% данные меняются - инача кривые руки проектировщика.
И ради этого некая оптимизация в вакууме?!

А бывает на блокировках строится стратегия. А оказывается при хитрых условиях в военное время непоколебимый принцип нарушается. Фтопку.
#спасибомикрософтзаэто

Мне кажется, что дело не в конкретной оптимизации, т.е. не добивалось специально. Скорее всего всё дело в множественных уровнях работы скуля. Используются системные механизмы работы со страницами. А они основаны (оптимизированны) на CRC - встроенный механиз процессоров. Соответственно принятие решения о грязных страницах и возможности чтения данных на нём и основанно. Только в случае если страница грязная, то срабатывает проверка, а чиста ли данная строка в грязной странице. Проверять все блокировки очень затратно.

Одно из проклятий для программистов: Что вам всю жизнь использовать среду в которой ВСЁ It depends. Приципов нет, законов нет. Наслаждайтесь.
15 мар 12, 13:22    [12252621]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Mnior
Притом всё запросы отрабатывают включая последний


может RCSI включен просто? :)
15 мар 12, 14:16    [12253307]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
AndyD
Member

Откуда:
Сообщений: 30
Crimean
Mnior
Притом всё запросы отрабатывают включая последний


может RCSI включен просто? :)

В примере TEMPDB используется
15 мар 12, 14:27    [12253433]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
упс!!

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2806.0
и на tempdb и на обычной базе без RCSI действительно работает

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)
ждем вычитки

однако
15 мар 12, 14:37    [12253550]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Про лог моя инфа не 100%. Это скорее предположение. Про dirty устанавливали экспериментально.

Сессия 1:
if @@trancount > 0
    rollback
go    
USE tempdb
GO
if object_id('ATest') is not null
    drop table ATest
go    
CREATE TABLE dbo.ATest (
	 ID	Int IDENTITY PRIMARY KEY
	,Name	VarChar(100)
);
-- TRUNCATE TABLE dbo.ATest
INSERT	dbo.ATest
SELECT	Convert(VarChar,V.number)
FROM	master.dbo.spt_values V

INSERT	dbo.ATest VALUES ('FFFFFFF')

declare 
    @ff_id int = scope_identity()
    
INSERT	dbo.ATest
SELECT	Convert(VarChar,V.number)
FROM	master.dbo.spt_values V

--update dbo.ATest set Name = name + '!' where id = @ff_id - 1    -- Если разбанить эту строк, вторая сессия повиснет.
--checkpoint                                                      -- Если разбанить предыдущую и эту, то вторая сессия заработает опять.

BEGIN TRAN
	UPDATE	dbo.ATest
	SET	Name = 'FFFFFFF'
--	SET	Name = 'DDDDDDD'
	WHERE	Name = 'FFFFFFF'


Сессия 2:
USE tempdb
GO
SELECT * FROM dbo.ATest


З.Ы.

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) 
	Sep 21 2011 22:45:45 
	Copyright (c) 1988-2008 Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
15 мар 12, 14:43    [12253634]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гавриленко Сергей Алексеевич
Опять по памяти, которую проверить не на чем. В скуле много разных интересных оптимизаций. Еще одна оптимизация - это апдейт значения на само себя. Сервер честно накладывает xlock (все равно, что select ... from ... with (xlock) where name = 'FFFFFFF' написать). Но. Поскольку значение реально не изменилось, то, не надо писать об изменении записи в лог (потому что не изменилось ничего), и не надо страницу помечать как dirty (опять же, страница и вправду ни разу не поменялась).

Отсюда ваши спецэффекты.


при этом триггеры срабатывают? по запросу можно определить, что ничего не меняется, но триггер может делать изменения.
15 мар 12, 15:15    [12254011]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Winnipuh
при этом триггеры срабатывают? по запросу можно определить, что ничего не меняется, но триггер может делать изменения.
Я ж написал, что про лог не 100% инфа.
15 мар 12, 15:19    [12254050]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn'y Block Select?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Winnipuh
при этом триггеры срабатывают? по запросу можно определить, что ничего не меняется, но триггер может делать изменения.
Ну и потом, беглый поиск находит следующее:
http://us.generation-nt.com/answer/are-inserted-deleted-tables-views-help-151187121.html
"Mike Hodgson" wrote in message news:eghs3%
I have been told recently, by a reliable source (Itzik Ben-Gan), that in SQL 2000 the insert & deleted virtual tables accessible in triggers are implemented in memory from the transaction log of the DB (ie. it builds a table in RAM from reading the tlog of the database).

At a guess I'd say that the execution plan tells you that MY_TABLE is being accessed because there's no better way to say, in an execution plan, that it's actually the transaction log that's being accessed. I guess you could interpret the execution plan step as "scan the change history for the MY_TABLE object", or something along those lines.

In SQL 2005 the inserted & deleted tables are created in tempdb using the new row versioning technology that has been added to SQL 2005.
15 мар 12, 15:35    [12254293]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Ох, помню, знатный срач на целый день был по этому поводу :) тестировали на 2005, 2008, 2008 r2, деталей уже не помню, но поведение отличалось местами.

Чего вы хотите-то? read committed гарантирует только то, что не будут прочитаны грязные данные.
нигде не сказано, что всегда будут накладываться s-блокировки, нечего закладываться на реализацию этого поведения.

зы еще пример:
1.
begin tran
select ...
from dbo.my_tab with(xlock)
where id = 42

2.
select ...
from dbo.my_tab
where id = 42
15 мар 12, 16:47    [12255216]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7600
Mnior
[/src]Притом всё запросы отрабатывают включая последний (WHERE Name ...).
Так что Relic Hunter возможно вы что-то путаете.
Прогнал ваш пример. Третий селект висит, как я и утверждал.

PS
У меня sql-тусаузник.
15 мар 12, 19:02    [12256297]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Relic Hunter
Mnior
[/src]Притом всё запросы отрабатывают включая последний (WHERE Name ...).
Так что Relic Hunter возможно вы что-то путаете.
Прогнал ваш пример. Третий селект висит, как я и утверждал.

PS
У меня sql-тусаузник.


2000 короче... пирчины такого напиcания остались непонятными...
15 мар 12, 19:15    [12256360]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
http://us.generation-nt.com/answer/are-inserted-deleted-tables-views-help-151187121.html
In SQL 2005 the inserted & deleted tables are created in tempdb using the new row versioning technology that has been added to SQL 2005.
Это видимо "оптимизация" чтобы вообще не держать страницы логов. Гипотетически должно приводить к меньшему потреблению памяти.

Но мне всё это не нравиться, получается одна логическая сущность имеет две реализации (в разных тяхнологггиях). Логично было и снапы основывать на логах. Ан нет.

Странно. Журнал то и не страницами пишется 11463675 (хотя я так в одно время подозревал). Получается что вроде никакого профита в новой тяхнологггии RowVersioning и нету. Опять маркетологи?

Может кто поделится соображениями, может я ошибаюсь - типа не до конца вижу особенности SNAPSHOT ISOLATION?
16 мар 12, 12:29    [12259343]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
саул
Guest
Relic Hunter
Приветствую.

есть таблица всего несколько записей.
[src sql]
create table atest(id integer identity primary key, name varchar(100));
....
Есть этому логическое объяснение?


А на кластерный индекс по полю id обратить внимание религия не позволяет ?
16 мар 12, 12:46    [12259475]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
AndyD
Member

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

А почему сущность-то одинаковая?
16 мар 12, 12:50    [12259514]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AndyD
А почему сущность-то одинаковая?
Версии строк.
В лог пишутся для восстановления (при откате). В tempdb (RowVersioning) для чтения в запросах.

В итоге в оперативе появляются логические дубли.
16 мар 12, 13:59    [12260192]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Mnior
В итоге в оперативе появляются логические дубли.
Я сомневаюсь, что то, что уже записано в лог, хранится в оперативной памяти.
16 мар 12, 14:02    [12260233]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
AndyD
Member

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

В логе не версии хранятся, а цепочки изменений.
Кроме того, они не в памяти, а на диске
16 мар 12, 14:14    [12260344]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
facepalm.jpg
AndyD
В логе не версии хранятся, а цепочки изменений.
Такие круглые цепочки в вакууме.
AndyD
Кроме того, они не в памяти, а на диске
Ага, прямая запись минуя даже проц и никогда не в память не попадают.

AndyD, не думаю что разговор у нас получится. Мышления уровня разных мы.

Ели тролли других троллей,
Смотрят тролли вокруг тролли,
Затроллили тролли троллей,
Тролли троллят троллей лол ...

© Симулякр
16 мар 12, 16:45    [12262075]     Ответить | Цитировать Сообщить модератору
 Re: Why Doesn't Block Select?  [new]
AndyD
Member

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

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