EDITADO después de leer el enlace del foro de MSDN del comentario , muy interesante.
Independientemente del nivel de aislamiento, dos usuarios no pueden actualizar una sola página simultáneamente, ni ningún usuario puede leer una página parcialmente actualizada. Solo imagine cómo trataría SQL Server con una página donde el encabezado dice que Col3 comienza en el byte 17. Pero realmente comienza en el byte 25, porque esa parte de la fila aún no se ha actualizado. No hay forma de que una base de datos pueda manejar eso.
Pero para las filas de más de 8k, se utilizan varias páginas, y eso hace posible una columna a medio actualizar. Copiado del enlace MSDN (en caso de que el enlace se rompa), inicie esta consulta en una ventana:
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
Esto crea una tabla y luego la actualiza con una cadena de 100.000x el mismo carácter. Mientras se ejecuta la primera consulta, inicie esta consulta en otra ventana:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
La segunda consulta se detiene cuando lee una columna que está medio actualizada. Es decir, cuando el primer personaje es diferente del último. Terminará rápidamente, lo que demuestra que es posible leer columnas medio actualizadas. Si elimina la nolock
pista, la segunda consulta nunca finalizará.
Resultado sorprendente! Una columna XML a medio actualizar podría romper un (nolock)
informe, porque el XML estaría mal formado.
NOLOCK
, estoy seguro de que sería posible diseñar una situación en la que las columnas del NCI fueran de una versión de la fila pero el CI de una versión diferente. Además, los datos fuera de fila y las páginas lob no estarían protegidos por el pestillo en la página de datos.nolock
sin encontrar su fila original. Sin embargo, una sola lectura de un campo o fila debe ser coherente.