Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36689
Игорь_UUS
Гавриленко Сергей Алексеевич
пропущено...
Вы ответы принципиально не читаете? Написали же все в первом же ответе: 21159923



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

мне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки. Или заблокировать всю таблицу (не желательно, но если другого гарантированного варианта нет, пускай будет всю)
Еще раз, для тех, кто в танке. Одиночный стейтмент выполняется в транзакции. Всегда и вне зависимости от того, что и где вы написали.
2 фев 18, 13:31    [21160487]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Игорь_UUS
мне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки.
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.
2 фев 18, 13:43    [21160558]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
Игорь_UUS
мне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки.
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.

RCSI?
2 фев 18, 13:44    [21160566]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
TaPaK
invm
пропущено...
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.

RCSI?

а что меняется-то для апдэйта на RCSI?
если данный апдэйт блокирован соседним апдэйтом,
он будет ждать соседского коммита(ну или роллбэка, без разницы).
и уж если сосед закоммитит, то прочитана будет последняя закоммиченная версия,
т.е. как раз то, что проапдэйтила соседняя сессия.
ну а при роллбэке будут прочитаны неизмененные данные.
какой же тут lost update?
---
у него в вопросе голый апдэйт (1 statement).
не сперва некое чтение, а потом апдэйт, и все это в транзакции,
а простой апдэйт.
которому вообще по барабану Isolation Level
2 фев 18, 14:20    [21160727]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
[quot Гавриленко Сергей Алексеевич]
Игорь_UUS
ибо 100% гарантии дает только страховой полис.

Владельцы ОСАГО с вами не согласны!
2 фев 18, 14:20    [21160728]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36689
+
Гавриленко Сергей Алексеевич
Игорь_UUS
ибо 100% гарантии дает только страховой полис.

Владельцы ОСАГО с вами не согласны!
Вы хотите спорить с О. Бендером?
2 фев 18, 14:21    [21160734]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Yasha123,

автор
а что меняется-то для апдэйта на RCSI?
если данный апдэйт блокирован соседним апдэйтом,
он будет ждать соседского коммита(ну или роллбэка, без разницы).
и уж если сосед закоммитит, то прочитана будет последняя закоммиченная версия,
т.е. как раз то, что проапдэйтила соседняя сессия.
ну а при роллбэке будут прочитаны неизмененные данные.
какой же тут lost update?

прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать
2 фев 18, 14:23    [21160742]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
TaPaK
Игорь_UUS,

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


всё понятно... выполнение любой операции это и есть транзакция, если нет явной происходит autocommit после каждого действия...
спасибо!
2 фев 18, 14:34    [21160779]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
dao
Member

Откуда: Москва
Сообщений: 771
Игорь_UUS
TaPaK
Игорь_UUS,

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


всё понятно... выполнение любой операции это и есть транзакция, если нет явной происходит autocommit после каждого действия...
спасибо!

не правильно.
2 фев 18, 14:35    [21160785]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
TaPaK
RCSI?
TaPaK
прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать
RCSI не распространяется на писателей.
2 фев 18, 14:38    [21160798]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
invm
Игорь_UUS
мне нужно обратиться к таблице, заблокировать одну запись c заданным ID, внести в неё изменения. В момент блокировки записи, все параллельные изменения не должны вноситься до её разблокировки.
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.


Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо
2 фев 18, 14:42    [21160811]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
dao
Member

Откуда: Москва
Сообщений: 771
Игорь_UUS
invm
пропущено...
Ответы не читаете? Или не понимаете прочитанное?
Еще раз - конкурирующие update никогда не вызовут "потерянных изменений". Никаких дополнительных манипуляций не требуется.


Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо

Вы успокойтесь и скажите что вам надо сделать , а не то что вы придумали в голове, и пытаетесь реализовать ))
Вам нужна непрерывная нумерация?
2 фев 18, 14:53    [21160855]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
гогол
Member [заблокирован]

Откуда:
Сообщений: 88
Изоляция транзакций.
2 фев 18, 14:59    [21160879]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
TaPaK
RCSI?
TaPaK
прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать
RCSI не распространяется на писателей.

в частности да, речь о том что если считать, протом менять
2 фев 18, 15:00    [21160884]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
TaPaK
речь о том что если считать, протом менять
Так это не случай ТС.
2 фев 18, 15:03    [21160900]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
TaPaK
речь о том что если считать, протом менять
Так это не случай ТС.

конечно, rcsi тоже не его случай :)
2 фев 18, 15:05    [21160906]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
TaPaK
Yasha123,

автор
а что меняется-то для апдэйта на RCSI?
если данный апдэйт блокирован соседним апдэйтом,
он будет ждать соседского коммита(ну или роллбэка, без разницы).
и уж если сосед закоммитит, то прочитана будет последняя закоммиченная версия,
т.е. как раз то, что проапдэйтила соседняя сессия.
ну а при роллбэке будут прочитаны неизмененные данные.
какой же тут lost update?

прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать

сделайте update с output на rcsi. в одном окне откройте транзакцию и делайте первый апдэйт без коммита, во втором окне апдэйт с аутпутом. ну теперь комитьте первого
2 фев 18, 15:09    [21160921]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Yasha123
TaPaK
Yasha123,

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

прочитаны будут данные на начало транзакции, ждать комита никто не будет чтобы читать

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

а так
--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 фев 18, 15:10    [21160927]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
TaPaK
а так
--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 сплошь и рядом.
2 фев 18, 15:17    [21160953]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
TaPaK
Yasha123
пропущено...

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

а так
--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, могу только заглавными написать, читайте внимательнее, плиз
2 фев 18, 15:25    [21160973]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Игорь_UUS
Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо
Думаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

При updat'е происходит примерно следующее - при считывании значения изменяемого столбца на строку таблицы накладывается U-блокировка (может и сразу X). И это гарантирует, что никакие конкурирующие писатели (update, delete и т.п.) не смогут прочитать значения из этой строки до снятия блокировки.
Потому что они тоже захотят наложить U и не смогут, ибо U не совместима с другой U или X.
2 фев 18, 15:28    [21160988]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
invm
Игорь_UUS
Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо
Думаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

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

вот именно.
а все уровни изоляций - они для читателей, а не для голых писателей
2 фев 18, 15:37    [21161047]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 670
invm
Игорь_UUS
Я реально запутался))) Дак надо что-то применять или нет... тут пишут то ли надо, то ли не надо
Думаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

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


Спасибо, получается ничего тут придумывать ненужно...
2 фев 18, 16:36    [21161347]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
dao
Member

Откуда: Москва
Сообщений: 771
Игорь_UUS
invm
пропущено...
Думаете я зря рекомендовал про блокировки читать. Вот прочли бы и перестали путаться.

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


Спасибо, получается ничего тут придумывать ненужно...

а вот не совсем )) - таки обрисуйте свою задачу - что у вас за "таблица-счётчик" ))
2 фев 18, 17:05    [21161429]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли вариант, при котором один момент времени несколько потоков изменяют данные?  [new]
msLex
Member

Откуда:
Сообщений: 7727
Yasha123
вот именно.
а все уровни изоляций - они для читателей, а не для голых писателей


Это не так

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


Результат

spiddbidObjIdIndIdTypeResourceModeStatus
54600DB SGRANT
54620473463580TAB IXGRANT
54121071545520TAB ISGRANT
54620153462440TAB IXGRANT
54620473463581PAG1:7741 IXGRANT
5432767-5712046560TAB Sch-SGRANT


spiddbidObjIdIndIdTypeResourceModeStatus
54600DB SGRANT
54620473463581KEY(98ec012aa510) RangeX-XGRANT
54620473463580TAB IXGRANT
54121071545520TAB ISGRANT
54620473463581PAG1:7741 IXGRANT
5432767-5712046560TAB Sch-SGRANT
2 фев 18, 18:30    [21161606]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить