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

Есть WEB сервер, модуль которого подключается к базе и вносит изменения в таблицу-счётчик. На сколько я понимаю в один момент времени на web сервер может придти "куча" запросов, и в один миг идут множество запросов в базу.

существует хранимая процедура, например скрипт самый простой:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE [Test]
AS
  UPDATE [Test_Table]
  SET
     [Inc_Fild]  = [Inc_Fild] - 1
GO



К примеру [Inc_Fild] = 100, в один момент времени пришло 100 запросов на web сервер, модуль которого которого стал вызывать хранимку в ста разных потоках. Если не делать BEGIN TRANSACTION, при завершении выполнения 100 запросов [Inc_Fild] будет равен "0", или же нет? Я к чему, может ли быть ситуация когда, первый поток вызова процедуры вносит изменения в БД а второй читает как бы "грязные" данные, изменения которых ещё не произошли? Или же MSSQL не позволит этого сделать, и выполнения множества потоков встанет в очередь и будет выполнение одно за другим?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595461
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все одиночные запросы выполняются в неявной транзакции
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595475
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

ничего не понятно, что вы спрашиваете, но есть такие чудеса как уровни изоляции

авторВсе одиночные запросы выполняются в неявной транзакции
хрюк
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595476
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stiВсе одиночные запросы выполняются в неявной транзакции

И что это значит?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595477
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595495
MSSQLBug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StarikNavyИгорь_UUS,
https://ru.wikipedia.org/wiki/Уровень_изолированности_транзакций
Лучше не читайте, там написан в основном бред с вредными советами.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595500
Игорь_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
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595506
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

а если сделать два BEGIN TRAN два COMMIT и один SAVE TRAN, то транзакция будет немного светиться
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595509
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSУ меня вопрос, если не делать BEGIN TRANSACTION и COMMIT TRANSACTION, может случиться так, что одна транзакция может быть утеряна?
Ещё раз - Все одиночные запросы выполняются в неявной транзакции. Так что абсолютно всё равно делай или не делай BEGIN TRANSACTION и COMMIT TRANSACTION.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595511
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stiИгорь_UUSУ меня вопрос, если не делать BEGIN TRANSACTION и COMMIT TRANSACTION, может случиться так, что одна транзакция может быть утеряна?
Ещё раз - Все одиночные запросы выполняются в неявной транзакции. Так что абсолютно всё равно делай или не делай BEGIN TRANSACTION и COMMIT TRANSACTION.
человек, может хоть узнаешь что же такое неявная транзакция прежде чем писать "ещё раз"
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595518
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stiИгорь_UUSУ меня вопрос, если не делать BEGIN TRANSACTION и COMMIT TRANSACTION, может случиться так, что одна транзакция может быть утеряна?
Ещё раз - Все одиночные запросы выполняются в неявной транзакции. Так что абсолютно всё равно делай или не делай BEGIN TRANSACTION и COMMIT TRANSACTION.

Вроде как нет. Если делать только BEGIN TRANSACTION, то другая транзакция не может изменить данные, которые обрабатываются в первой, до момента её завершения
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595520
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKИгорь_UUS,

а если сделать два BEGIN TRAN два COMMIT и один SAVE TRAN, то транзакция будет немного светиться

Вы так и не можете дать внятного ответа... то ли "да" то ли "нет".

Как должен выглядеть TSQL, чтоб гарантировать пропадания какого либо Update'та?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595522
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSTaPaKИгорь_UUS,

а если сделать два BEGIN TRAN два COMMIT и один SAVE TRAN, то транзакция будет немного светиться

Вы так и не можете дать внятного ответа... то ли "да" то ли "нет".

Как должен выглядеть TSQL, чтоб гарантировать пропадания какого либо Update'та?
я в ужасе узнал что они бывают не попадают

авторесть такие чудеса как уровни изоляции
читайте и думайте
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595523
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSКак должен выглядеть TSQL, чтоб гарантировать пропадания какого либо Update'та?Застрахованным должен выглядеть, ибо 100% гарантии дает только страховой полис.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595527
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
UPDATE a set
  SET
     [Inc_Fild]  = [Inc_Fild] - 1
from [Test_Table] a with ( xlock, holdlock )
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595532
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичИгорь_UUSКак должен выглядеть TSQL, чтоб гарантировать пропадания какого либо Update'та?Застрахованным должен выглядеть, ибо 100% гарантии дает только страховой полис.

и он не даёт
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595542
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSОбе транзакции одновременно читают текущее состояние поля.При update невозможно.
Читайте про блокировки. В частности про U.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595545
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич
Код: sql
1.
2.
3.
4.
UPDATE a set
  SET
     [Inc_Fild]  = [Inc_Fild] - 1
from [Test_Table] a with ( xlock, holdlock )



Спасибо, почитал, похоже то что надо. Но в описании говориться, что необходимо обязательно открыть транзакцию т.е. где-то выше должно быть BEGIN TRANSACTION

это так? или BEGIN TRANSACTION можно и не делать?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595553
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSГавриленко Сергей Алексеевич
Код: sql
1.
2.
3.
4.
UPDATE a set
  SET
     [Inc_Fild]  = [Inc_Fild] - 1
from [Test_Table] a with ( xlock, holdlock )




Спасибо, почитал, похоже то что надо. Но в описании говориться, что необходимо обязательно открыть транзакцию т.е. где-то выше должно быть BEGIN TRANSACTION

это так? или BEGIN TRANSACTION можно и не делать?Вы ответы принципиально не читаете? Написали же все в первом же ответе: 21159923
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595554
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

действительно неявной? implicit?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595558
edyaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для решения вашей проблемы используйте insert вместо update.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595561
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edyaNдля решения вашей проблемы используйте insert вместо update.
так кто опять дверь в ад не закрыл?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595576
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей АлексеевичИгорь_UUSпропущено...


Спасибо, почитал, похоже то что надо. Но в описании говориться, что необходимо обязательно открыть транзакцию т.е. где-то выше должно быть BEGIN TRANSACTION

это так? или BEGIN TRANSACTION можно и не делать?Вы ответы принципиально не читаете? Написали же все в первом же ответе: 21159923


Вы меня запутали, при чём тут не явные транзакции??? Я не использую вообще SET IMPLICIT_TRANSACTIONS ON

мне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки. Или заблокировать всю таблицу (не желательно, но если другого гарантированного варианта нет, пускай будет всю)
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595579
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

ответ вам уже дан. Если осилили прочитать про нейвные, прочитайте и про явные и неожиднный autocommit
https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595581
edyaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

да ладно, там данных-то поди...
100 в секунду = 8640000 в сутки. Для int это ок 33 mb. Ну там ключ какой-нить, пусть будет 100 mb. Это же не проблема.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595582
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSГавриленко Сергей Алексеевичпропущено...
Вы ответы принципиально не читаете? Написали же все в первом же ответе: 21159923


Вы меня запутали, при чём тут не явные транзакции??? Я не использую вообще SET IMPLICIT_TRANSACTIONS ON

мне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки. Или заблокировать всю таблицу (не желательно, но если другого гарантированного варианта нет, пускай будет всю)Еще раз, для тех, кто в танке. Одиночный стейтмент выполняется в транзакции. Всегда и вне зависимости от того, что и где вы написали.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595594
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSмне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки.Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595595
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmИгорь_UUSмне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки.Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.
RCSI?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595624
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKinvmпропущено...
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.
RCSI?
а что меняется-то для апдэйта на RCSI?
если данный апдэйт блокирован соседним апдэйтом,
он будет ждать соседского коммита(ну или роллбэка, без разницы).
и уж если сосед закоммитит, то прочитана будет последняя закоммиченная версия,
т.е. как раз то, что проапдэйтила соседняя сессия.
ну а при роллбэке будут прочитаны неизмененные данные.
какой же тут lost update?
---
у него в вопросе голый апдэйт (1 statement).
не сперва некое чтение, а потом апдэйт, и все это в транзакции,
а простой апдэйт.
которому вообще по барабану Isolation Level
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595625
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Гавриленко Сергей Алексеевич]Игорь_UUSибо 100% гарантии дает только страховой полис.
Владельцы ОСАГО с вами не согласны!
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595626
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичИгорь_UUSибо 100% гарантии дает только страховой полис.

Владельцы ОСАГО с вами не согласны!Вы хотите спорить с О. Бендером?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595630
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

автора что меняется-то для апдэйта на RCSI?
если данный апдэйт блокирован соседним апдэйтом,
он будет ждать соседского коммита(ну или роллбэка, без разницы).
и уж если сосед закоммитит, то прочитана будет последняя закоммиченная версия,
т.е. как раз то, что проапдэйтила соседняя сессия.
ну а при роллбэке будут прочитаны неизмененные данные.
какой же тут lost update?
прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595638
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKИгорь_UUS,

ответ вам уже дан. Если осилили прочитать про нейвные, прочитайте и про явные и неожиднный autocommit
https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx

всё понятно... выполнение любой операции это и есть транзакция, если нет явной происходит autocommit после каждого действия...
спасибо!
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595641
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSTaPaKИгорь_UUS,

ответ вам уже дан. Если осилили прочитать про нейвные, прочитайте и про явные и неожиднный autocommit
https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx

всё понятно... выполнение любой операции это и есть транзакция, если нет явной происходит autocommit после каждого действия...
спасибо!
не правильно.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595642
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKRCSI?TaPaKпрочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читатьRCSI не распространяется на писателей.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595645
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmИгорь_UUSмне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки.Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.

Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595656
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSinvmпропущено...
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.

Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо
Вы успокойтесь и скажите что вам надо сделать , а не то что вы придумали в голове, и пытаетесь реализовать ))
Вам нужна непрерывная нумерация?
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595662
гогол
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изоляция транзакций.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595664
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmTaPaKRCSI?TaPaKпрочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читатьRCSI не распространяется на писателей.
в частности да, речь о том что если считать, протом менять
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595669
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKречь о том что если считать, протом менятьТак это не случай ТС.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595670
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmTaPaKречь о том что если считать, протом менятьТак это не случай ТС.
конечно, rcsi тоже не его случай :)
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595675
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKYasha123,

автора что меняется-то для апдэйта на RCSI?
если данный апдэйт блокирован соседним апдэйтом,
он будет ждать соседского коммита(ну или роллбэка, без разницы).
и уж если сосед закоммитит, то прочитана будет последняя закоммиченная версия,
т.е. как раз то, что проапдэйтила соседняя сессия.
ну а при роллбэке будут прочитаны неизмененные данные.
какой же тут lost update?
прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать
сделайте update с output на rcsi. в одном окне откройте транзакцию и делайте первый апдэйт без коммита, во втором окне апдэйт с аутпутом. ну теперь комитьте первого
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595678
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123TaPaKYasha123,

пропущено...

прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать
сделайте update с output на rcsi. в одном окне откройте транзакцию и делайте первый апдэйт без коммита, во втором окне апдэйт с аутпутом. ну теперь комитьте первого
а так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--1 tran
BEGIN TRAN 

UPDATE dbo.P SET Id = 500
--COMMIT

--2 tran
BEGIN TRAN 
DECLARE @a INT = ( SELECT MAX(Id) FROM dbo.P )
UPDATE dbo.P SET Id = @a

COMMIT
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595688
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKа так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--1 tran
BEGIN TRAN 

UPDATE dbo.P SET Id = 500
--COMMIT

--2 tran
BEGIN TRAN 
DECLARE @a INT = ( SELECT MAX(Id) FROM dbo.P )
UPDATE dbo.P SET Id = @a

COMMIT

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

сделайте update с output на rcsi. в одном окне откройте транзакцию и делайте первый апдэйт без коммита, во втором окне апдэйт с аутпутом. ну теперь комитьте первого
а так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--1 tran
BEGIN TRAN 

UPDATE dbo.P SET Id = 500
--COMMIT

--2 tran
BEGIN TRAN 
DECLARE @a INT = ( SELECT MAX(Id) FROM dbo.P )
UPDATE dbo.P SET Id = @a

COMMIT


у меня там написано аж 2 раза: у товарища ГОЛЫЙ АПДЭЙТ, А НЕ СЕЛЕКТ + АПДЭЙТ И ВСЕ ЭТО В ОДНОЙ ТРАНЗАКЦИИ. пишу не с компа, с приложения в телефоне, у него не предусмотрено bold + size 3, могу только заглавными написать, читайте внимательнее, плиз
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595696
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSЯ реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надоДумаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

При updat'е происходит примерно следующее - при считывании значения изменяемого столбца на строку таблицы накладывается U-блокировка (может и сразу X). И это гарантирует, что никакие конкурирующие писатели (update, delete и т.п.) не смогут прочитать значения из этой строки до снятия блокировки.
Потому что они тоже захотят наложить U и не смогут, ибо U не совместима с другой U или X.
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595702
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmИгорь_UUSЯ реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надоДумаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

При updat'е происходит примерно следующее - при считывании значения изменяемого столбца на строку таблицы накладывается U-блокировка (может и сразу X). И это гарантирует, что никакие конкурирующие писатели (update, delete и т.п.) не смогут прочитать значения из этой строки до снятия блокировки.
Потому что они тоже захотят наложить U и не смогут, ибо U не совместима с другой U или X.
вот именно.
а все уровни изоляций - они для читателей, а не для голых писателей
...
Рейтинг: 0 / 0
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #39595754
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmИгорь_UUSЯ реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надоДумаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

При updat'е происходит примерно следующее - при считывании значения изменяемого столбца на строку таблицы накладывается U-блокировка (может и сразу X). И это гарантирует, что никакие конкурирующие писатели (update, delete и т.п.) не смогут прочитать значения из этой строки до снятия блокировки.
Потому что они тоже захотят наложить U и не смогут, ибо U не совместима с другой U или X.

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

При updat'е происходит примерно следующее - при считывании значения изменяемого столбца на строку таблицы накладывается U-блокировка (может и сразу X). И это гарантирует, что никакие конкурирующие писатели (update, delete и т.п.) не смогут прочитать значения из этой строки до снятия блокировки.
Потому что они тоже захотят наложить U и не смогут, ибо U не совместима с другой U или X.

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

Это не так

Код: 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
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
    #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
58 сообщений из 58, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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