Отредактировано после прочтения ссылки на форум MSDN из комментария , очень интересно.
Независимо от уровня изоляции, два пользователя не могут обновлять одну страницу одновременно, и никто не может прочитать частично обновленную страницу. Только представьте, как SQL Server будет обращаться со страницей, где заголовок говорит, что Col3 начинается с байта 17. Но он действительно начинается с байта 25, потому что эта часть строки еще не была обновлена. База данных не может справиться с этим.
Но для строк размером более 8 Кб используется несколько страниц, и это делает возможным половину обновленного столбца. Скопированный из ссылки MSDN (в случае разрыва связи), запустите этот запрос в одном окне:
if object_id('TestTable') is not null
drop table TestTable
create table TestTable (txt nvarchar(max) not null)
go
insert into TestTable select replicate(convert(varchar(max),
char(65+abs(checksum(newid()))%26)),100000)
go 10
update TestTable set txt=replicate(convert(varchar(max),
char(65+abs(checksum(newid()))%26)),100000)
go 100000
Это создает таблицу, а затем обновляет ее строкой в 100 000 раз того же символа. Пока выполняется первый запрос, запустите этот запрос в другом окне:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
Второй запрос останавливается, когда он читает столбец, который наполовину обновлен. То есть когда первый персонаж отличается от последнего. Это закончится быстро, доказав, что можно читать наполовину обновленные столбцы. Если вы удалите nolock
подсказку, второй запрос никогда не закончится.
Удивительный результат! Наполовину обновленный столбец XML может привести к поломке (nolock)
отчета, поскольку XML будет искажен.
NOLOCK
Я уверен» можно было бы спроектировать ситуацию, когда столбцы NCI были из одной версии строки, а CI - из другой версии. Кроме того, данные вне строки и страницы лобов не будут защищены защелкой на странице данных.nolock
не смог найти исходную строку. Тем не менее, одно чтение поля или строки должно быть последовательным.