После некоторого созерцания и экспериментов, я полагаю, что СУБД не обеспечивают такой целостности значений:
- Если бы мы предполагали такую возможность, то мы немедленно пришли к выводу, что та же самая транзакция вВ одной и той же области транзакции могут использоваться не полностью определенные (записанные, вставленные, обновленные, удаленные) значения, чего на самом деле никогда не происходит;
- Значения используются не только СУБД, но и вне ее операционной системой и другими программными платформами
Скорее всего, это функции транзакций, реализованные на операционной системе или даже на более низком (машинном, аппаратном) уровне.
Обновление:
Ответ Гэри поддерживает его:
"Эти защелки представляют собой операции ЦП очень низкого уровня и удерживаются только в течение очень коротких периодов времени."
Хотя я не собирался смешивать обсуждение явлений изоляции транзакций СУБД с поддержкой транзакций низкого уровня, предоставляемой оборудованием.
Update2:
И как было бы лучше назвать соответствующий термин низкого уровня (поддержка аппаратных транзакций), чтобы избежать его путаницы и несоответствия с терминологией транзакций СУБД?Это постоянство ценностей или целостность ценностей?
Update3:
Предположим, у меня есть строка 2 ГБ в nvarchar (макс.), Имеющая 1 ГБ ОЗУ.Как CPU обеспечит целостность этого значения на аппаратном уровне?
Ответ Razvan Socol в потоке msdn Предотвращено ли чтение наполовину записанных подсказок WITH (NOLOCK)? дает скрипт, перехватывающий чтение частично обновленных значений.Этот сайт в настоящее время недоступен, и я заново создаю этот код здесь:
1) Создайте тестовую таблицу и заполните ее 10 строками:
if object_id('Test') IS not NULL
drop table Test;
CREATE TABLE Test (
ID int IDENTITY PRIMARY KEY,
Txt nvarchar(max) NOT NULL
)
GO
-----------
INSERT INTO Test
SELECT REPLICATE(CONVERT(nvarchar(max),
CHAR(65+ABS(CHECKSUM(NEWID()))%26)),100000)
GO 10
---
2)
В первом сеансе(вкладка SSMS) обновление, отнимающее много времени:
UPDATE Test
SET Txt=REPLICATE(CONVERT(nvarchar(max),
CHAR(65+ABS(CHECKSUM(NEWID()))%26)),100000)
GO 1000
3)
Во втором сеансе (вкладка SSMS) запускается перехват перезаписанных значений:
WHILE 1=1 BEGIN
SELECT Txt FROM Test WITH (NOLOCK)
WHERE LEN(REPLACE(Txt,LEFT(Txt,1),''))<>0;
select 'rowcount inside=',@@rowcount;
IF @@ROWCOUNT<>0 BREAK
END
--for wishing to try it in non-SqlServer DBMS
-- WITH(NOLOCK) hint is another way as setting READ UNCOMMITTED tx iso level
--SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
WellЭто SSMS SQL Server 2008 R2, довольно быстро перехватывающая кучу перезаписанных значений.
Мне интересно, каковы результаты в других СУБД?