powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
8 сообщений из 58, страница 3 из 3
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595833
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

может речь о гранулярности, а не уровне изоляции?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595852
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexYasha123вот именно.
а все уровни изоляций - они для читателей, а не для голых писателей

Это не так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
create table test (
	id int not null primary key clustered
	, v int 
)

insert test(
	id
)
values (1), (3)



begin tran
set transaction isolation level read committed

update test with(rowlock) set 
	v = 1  
where 
	id = 2

exec sp_lock @@spid

commit



begin tran
set transaction isolation level serializable 
update test with(rowlock) set 
	v = 1  
where 
	id = 2

exec sp_lock @@spid

commit


drop table test



Результат

spiddbidObjIdIndIdTypeResourceModeStatus54600DB SGRANT54620473463580TAB IXGRANT54121071545520TAB ISGRANT54620153462440TAB IXGRANT54620473463581PAG1:7741 IXGRANT5432767-5712046560TAB Sch-SGRANT

spiddbidObjIdIndIdTypeResourceModeStatus54600DB SGRANT 54 6 2047346358 1 KEY (98ec012aa510) RangeX-X GRANT 54620473463580TAB IXGRANT54121071545520TAB ISGRANT54620473463581PAG1:7741 IXGRANT5432767-5712046560TAB Sch-SGRANT
а что тут надо было увидеть? где, на каком уровне изоляции писатель вдруг не ждет другого писателя?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595858
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKmsLex,

может речь о гранулярности, а не уровне изоляции?

т.е. вместо

Yasha123вот именно.
а все уровни изоляций - они для читателей, а не для голых писателей


стоит читать

Yasha123вот именно.
а все уровни гранулярности - они для читателей, а не для голых писателей

?

По-моему, это еще дальше от истины
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595859
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123msLexпропущено...


Это не так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
create table test (
	id int not null primary key clustered
	, v int 
)

insert test(
	id
)
values (1), (3)



begin tran
set transaction isolation level read committed

update test with(rowlock) set 
	v = 1  
where 
	id = 2

exec sp_lock @@spid

commit



begin tran
set transaction isolation level serializable 
update test with(rowlock) set 
	v = 1  
where 
	id = 2

exec sp_lock @@spid

commit


drop table test




Результат

spiddbidObjIdIndIdTypeResourceModeStatus54600DB SGRANT54620473463580TAB IXGRANT54121071545520TAB ISGRANT54620153462440TAB IXGRANT54620473463581PAG1:7741 IXGRANT5432767-5712046560TAB Sch-SGRANT

spiddbidObjIdIndIdTypeResourceModeStatus54600DB SGRANT 54 6 2047346358 1 KEY (98ec012aa510) RangeX-X GRANT 54620473463580TAB IXGRANT54121071545520TAB ISGRANT54620473463581PAG1:7741 IXGRANT5432767-5712046560TAB Sch-SGRANT
а что тут надо было увидеть? где, на каком уровне изоляции писатель вдруг не ждет другого писателя?


в первом примере, после update (до конца транзакции), в другой транзакции уже можно добавить запись с id =2, во втором нет.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595958
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSВот про что я говорю, из статьи выше:

Ситуация, когда при одновременном изменении одного блока данных разными транзакциями одно из изменений теряется.

Предположим, имеются две транзакции, выполняемые одновременно:

Транзакция 1 Транзакция 2
UPDATE tbl1 SET f2=f2+20 WHERE f1=1; UPDATE tbl1 SET f2=f2+25 WHERE f1=1;
В обеих транзакциях изменяется значение поля f2, по их завершении значение поля должно быть увеличено на 45. В действительности может возникнуть следующая последовательность действий:

Обе транзакции одновременно читают текущее состояние поля. Точная физическая одновременность здесь не обязательна, достаточно, чтобы вторая по порядку операция чтения выполнилась до того, как другая транзакция запишет свой результат.
Обе транзакции вычисляют новое значение поля, прибавляя, соответственно, 20 и 25 к ранее прочитанному значению.
Транзакции пытаются записать результат вычислений обратно в поле f2. Поскольку физически одновременно две записи выполнить невозможно, в реальности одна из операций записи будет выполнена раньше, другая позже. При этом вторая операция записи перезапишет результат первой.
В результате значение поля f2 по завершении обеих транзакций может увеличиться не на 45, а на 20 или 25, то есть одна из изменяющих данные транзакций «пропадёт».




У меня вопрос, если не делать BEGIN TRANSACTION и COMMIT TRANSACTION, может случиться так, что одна транзакция может быть утеряна?

С каким уровнем изоляции выполняются ваши запросы? Ответив на этот вопрос, вы ответите и на свой, просто включив логику и голову.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39596640
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexт.е. вместо

Yasha123вот именно.
а все уровни изоляций - они для читателей, а не для голых писателей


стоит читать

Yasha123вот именно.
а все уровни гранулярности - они для читателей, а не для голых писателей

?


нет, следует читать то, что написано.
а именно, уровни изоляции описывают то,
что можно увидеть при чтении на них (не при записи)
------------------------------------------------------------------------

авторв первом примере, после update (до конца транзакции), в другой транзакции уже можно добавить запись с id =2, во втором нет.

ну что тут сказать.
я обсуждаю уровни изоляции .
а вы их реализацию от MS.

открываем описание уровней изоляции даже от MS:
Isolation Levels in the Database Engine
(хотя конечно лучше прямо от Дэйта, но под рукой сейчас нет)
и читаем концепцию:

авторTransaction isolation levels control:

* Whether locks are taken when data is read, and what type of locks are requested.

* How long the read locks are held.

* Whether a read operation referencing rows modified by another transaction:

*** Blocks until the exclusive lock on the row is freed.

*** Retrieves the committed version of the row that existed at the time the statement or transaction started.

*** Reads the uncommitted data modification.

Choosing a transaction isolation level does not affect the locks acquired to protect data modifications. A transaction always gets an exclusive lock on any data it modifies, and holds that lock until the transaction completes, regardless of the isolation level set for that transaction. For read operations, transaction isolation levels primarily define the level of protection from the effects of modifications made by other transactions.

еще обращаем внимание на названия уровней:
это read uncommitted, read committed, repeatable read
и ни слова о write.

ибо концепция такова.

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

пример
у меня в таблице имен всего лишь 2 города:

Код: sql
1.
2.
create table dbo.cities (name nvarchar(100) not null primary key);
insert into dbo.cities values (N'Барнаул'), (N'Волгоград');



и на serializable я читаю с фильтром
Код: sql
1.
where name between N'Б' and  N'В'



Код: sql
1.
2.
3.
4.
5.
6.
begin tran
set transaction isolation level serializable

select *
from dbo.cities 
where name between N'Б' and  N'В'


теперь соседняя сессия пытается вставить N'Анадырь' и повисает
спрашивается, чем провинился Анадырь?
и можно ли из этого примера сделать вывод, что на serializable блокируют то, что вообще не имеет никакого отношения
к самой выборке на serializable?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39596703
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123Бла-бла-бла


вот ваше утверждение

Yasha123а все уровни изоляций - они для читателей, а не для голых писателей


я привел репро, его опровергающее, все остальное болтовня и попытка "сделать хорошую мину при плохой игре"
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39596712
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexYasha123Бла-бла-бла


вот ваше утверждение

Yasha123а все уровни изоляций - они для читателей, а не для голых писателей


я привел репро, его опровергающее, все остальное болтовня и попытка "сделать хорошую мину при плохой игре"
ну если это
Choosing a transaction isolation level does not affect the locks acquired to protect data modifications.
переводится как бла-бла-бла,
а вы не понимаете и не желаете понять различие между уровнями изоляции
и их конкретной реализацией,
то ... хорошего дня.
...
Рейтинг: 0 / 0
8 сообщений из 58, страница 3 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]