Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные? / 25 сообщений из 58, страница 1 из 3
02.02.2018, 10:39
    #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
02.02.2018, 10:55
    #39595461
sti
sti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
Все одиночные запросы выполняются в неявной транзакции
...
Рейтинг: 0 / 0
02.02.2018, 11:14
    #39595475
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
Игорь_UUS,

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

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

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

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

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

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

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

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

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

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

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

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

и он не даёт
...
Рейтинг: 0 / 0
02.02.2018, 12:54
    #39595542
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
Игорь_UUSОбе транзакции одновременно читают текущее состояние поля.При update невозможно.
Читайте про блокировки. В частности про U.
...
Рейтинг: 0 / 0
02.02.2018, 12:59
    #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
02.02.2018, 13:04
    #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
02.02.2018, 13:07
    #39595554
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?
Гавриленко Сергей Алексеевич,

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


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

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


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

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

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

да ладно, там данных-то поди...
100 в секунду = 8640000 в сутки. Для int это ок 33 mb. Ну там ключ какой-нить, пусть будет 100 mb. Это же не проблема.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные? / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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