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

Откуда:
Сообщений: 420
Привет всем!

В общем нужно выбрать запись, монопольно заблокировать. Потом выбрать другую заблокировать, другие транзакции при этом должны встать в очередь, изменить. И после изменения вторую разблокировать, а первая должна оставаться заблокированной.
Как то так
Set Transaction Isolation Level Read Committed
Begin Transaction
  Declare @I       int
  Declare @I1      int
  Select @i=iu from Table1 With(RowLock,XLock) Where id=1
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Update Table1 set iu=@i1+@i where id=2 
  -- Вот здесь освободить 2-ю запись
  Waitfor Delay '00:00:15'
Commit Transaction

Но так скорее всего нельзя.

Set Transaction Isolation Level Read Committed
Begin Transaction
  Declare @I       int
  Declare @I1      int
  Select @i=iu from Table1 With(RowLock,XLock) Where id=1
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Update Table1 set iu=@i1+@i,ip=ip+1 where id=2 
  Waitfor Delay '00:00:50'
  Commit Transaction
  Begin Transaction
  Select @i=iu from Table1 With(RowLock,XLock) Where id=1
  Waitfor Delay '00:00:15'
Commit Transaction


Если закоммитить, то некоторые транзакции процентов 10 успевают влезть между Commit Transaction, Begin Transaction.
Придумать, как запретить изменять первую запись, конечно можно, но может есть изящный способ?
16 фев 16, 02:18    [18821427]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
использовать 2 коннекта например
16 фев 16, 02:50    [18821437]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Crimean
использовать 2 коннекта например


В CLR то можно, а как в обычной процедуре втиснуть 2 коннекта?
16 фев 16, 04:36    [18821450]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
aleks2
Guest
Если вам нечем заняться - sp_getapplock - ваш единственный выход.
16 фев 16, 06:22    [18821494]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Multy,

с какой целью Вы это делаете?
16 фев 16, 12:19    [18822800]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
ппп-пп
Guest
Multy,

Кажется, что Ваша постановка задачи немного противоречит самому понятию "транзакция".
16 фев 16, 12:26    [18822834]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Adx
Guest
Multy
Привет всем!

В общем нужно выбрать запись, монопольно заблокировать. Потом выбрать другую заблокировать, другие транзакции при этом должны встать в очередь, изменить. И после изменения вторую разблокировать, а первая должна оставаться заблокированной.
Как то так
Set Transaction Isolation Level Read Committed
Begin Transaction
  Declare @I       int
  Declare @I1      int
  Select @i=iu from Table1 With(RowLock,XLock) Where id=1
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Update Table1 set iu=@i1+@i where id=2 
  -- Вот здесь освободить 2-ю запись
  Waitfor Delay '00:00:15'
Commit Transaction

Но так скорее всего нельзя.

Set Transaction Isolation Level Read Committed
Begin Transaction
  Declare @I       int
  Declare @I1      int
  Select @i=iu from Table1 With(RowLock,XLock) Where id=1
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Update Table1 set iu=@i1+@i,ip=ip+1 where id=2 
  Waitfor Delay '00:00:50'
  Commit Transaction
  Begin Transaction
  Select @i=iu from Table1 With(RowLock,XLock) Where id=1
  Waitfor Delay '00:00:15'
Commit Transaction


Если закоммитить, то некоторые транзакции процентов 10 успевают влезть между Commit Transaction, Begin Transaction.
Придумать, как запретить изменять первую запись, конечно можно, но может есть изящный способ?


Придумайте неизящный, для начала. А то получается - я придумать могу, но мне лень. Вы думайте.
16 фев 16, 13:03    [18823130]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Владислав Колосов
Multy,

с какой целью Вы это делаете?


Вообще классическая ситуация в многопользовательской системе. Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.
16 фев 16, 16:25    [18824634]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Multy
Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.

Разве ваш пример не делается одной командой update c output ?
16 фев 16, 16:33    [18824694]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Glory
Multy
Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.

Разве ваш пример не делается одной командой update c output ?


Делает только не сразу и не одной командой
  Update Table1 set iu=@i1+@i,ip=ip+1 where id=2 
  Waitfor Delay '00:00:50'
  Commit Transaction
    --тут могут другие транзакции влезть
  Begin Transaction
16 фев 16, 16:41    [18824749]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Multy
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Update Table1 set iu=@i1+@i where id=2 

Зачем нужен этот select ?
16 фев 16, 16:44    [18824765]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Glory
Multy
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Update Table1 set iu=@i1+@i where id=2 

Зачем нужен этот select ?


Потому, что может быть вот так:
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Waitfor Delay '00:00:15'
  Update Table1 set iu=@i1+@i where id=2 
16 фев 16, 16:50    [18824822]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Multy
Потому, что может быть вот так:
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Waitfor Delay '00:00:15'
  Update Table1 set iu=@i1+@i where id=2 

Это пример того, "чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок." ?
В чем смысл раннего блокирования записи, которую нужно просто обновить ?
Может просто надо ваши iu хранить не в записях, а в столбцах ?
16 фев 16, 16:53    [18824857]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Glory
Multy
Потому, что может быть вот так:
  Select @i1=iu from Table1 With(RowLock,XLock) Where id=2 
  Waitfor Delay '00:00:15'
  Update Table1 set iu=@i1+@i where id=2 

Это пример того, "чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок." ?
В чем смысл раннего блокирования записи, которую нужно просто обновить ?
Может просто надо ваши iu хранить не в записях, а в столбцах ?


У кого-то слабовато с воображением :), пример условный

Между выборкой и сохранением может быть множество изменений в других таблицах и только поле будет ясно, что сохранять.
16 фев 16, 17:05    [18824945]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Multy
У кого-то слабовато с воображением :), пример условный

Другого вы не привели. Додумывать за вас я не собираюсь.

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

Это ответ на вопрос "зачем заранее блокировать" ?
Т.е. алгоритм такой у вас - сначала заблокировую, а потом буду выяснять, понадобится ли эта блокировка ?
16 фев 16, 17:09    [18824977]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Multy
Владислав Колосов
Multy,

с какой целью Вы это делаете?


Вообще классическая ситуация в многопользовательской системе. Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.


Вы противоречите сами себе намерением удержать блокировку (вторая строка первого сообщения в теме).
16 фев 16, 17:19    [18825048]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Владислав Колосов
Multy
пропущено...


Вообще классическая ситуация в многопользовательской системе. Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.


Вы противоречите сами себе намерением удержать блокировку (вторая строка первого сообщения в теме).


Может я плохой писатель, или вы плохой читатель: удержать нужно первую блокировку, а вторую освободить не отпуская первую.
16 фев 16, 17:23    [18825080]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Multy
Владислав Колосов
пропущено...


Вы противоречите сами себе намерением удержать блокировку (вторая строка первого сообщения в теме).


Может я плохой писатель, или вы плохой читатель: удержать нужно первую блокировку, а вторую освободить не отпуская первую.


Верно, а как это согласуется с
автор
Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.
16 фев 16, 17:28    [18825115]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Multy
Может я плохой писатель, или вы плохой читатель: удержать нужно первую блокировку, а вторую освободить не отпуская первую.

Блокировки - они не сами по себе. Блокировки - они составляющая транзакции.
То, что вы сказали, соответствует - как бы мне частично завершить транзакцию, вернее выкинуть из нее вон ту таблицу.
16 фев 16, 17:30    [18825131]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
Multy
удержать нужно первую блокировку, а вторую освободить не отпуская первую.
Если согласованность данных вас не интересует, зачем тогда все делать в одной транзакции?
16 фев 16, 17:36    [18825165]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Владислав Колосов
Multy
пропущено...


Может я плохой писатель, или вы плохой читатель: удержать нужно первую блокировку, а вторую освободить не отпуская первую.


Верно, а как это согласуется с
автор
Чем быстрее освободим блокировки - тем меньше вероятность взаимоблокировок.


Тупим или понтуемся? Первую нужно удержать ОБЯЗАТЕЛЬНО, похрен на всех, а вот последующие освобождать как можно быстрее.
16 фев 16, 17:38    [18825177]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
Glory
Multy
У кого-то слабовато с воображением :), пример условный

Другого вы не привели. Додумывать за вас я не собираюсь.

Додумывать за меня и не надо, я уже в писал, что уже знаю как сделать.
А вы на это способны? Только имеющий отдаленное отношение к многопользовательским базам
Glory
Multy
Между выборкой и сохранением может быть множество изменений в других таблицах и только поле будет ясно, что сохранять.

Это ответ на вопрос "зачем заранее блокировать" ?
Т.е. алгоритм такой у вас - сначала заблокировую, а потом буду выяснять, понадобится ли эта блокировка ?


может не знать зачем блокировать, а потом выяснять надо ли это.
16 фев 16, 17:41    [18825195]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
Multy
Додумывать за меня и не надо, я уже в писал, что уже знаю как сделать.
Судя по
Multy
Первую нужно удержать ОБЯЗАТЕЛЬНО, похрен на всех, а вот последующие освобождать как можно быстрее.
Не знаете. Более того, не понимаете, что такое блокировки, для чего они нужны и как связаны с транзакциями.

Писатели мешают читателям? Используйте снепшотные уровни изоляций. Их для этого и придумали.
16 фев 16, 18:01    [18825345]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Multy
Владислав Колосов
пропущено...


Верно, а как это согласуется с пропущено...


Тупим или понтуемся? Первую нужно удержать ОБЯЗАТЕЛЬНО, похрен на всех, а вот последующие освобождать как можно быстрее.


Все блокировки равны, не бывает более равных. Если удерживать хотя бы одну на той же таблице - это приведет к удержанию всех запросов, которые попытаются наложить несовместимы тип блокировки с учетом гранулярности. И никак быстрое снятие второй блокировки здесь не поможет.
16 фев 16, 18:20    [18825455]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли разблокировать запись до завершения транзакции?  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
invm
Multy
Додумывать за меня и не надо, я уже в писал, что уже знаю как сделать.
Судя по
Multy
Первую нужно удержать ОБЯЗАТЕЛЬНО, похрен на всех, а вот последующие освобождать как можно быстрее.
Не знаете.

Вы не иначе телепат батенька. Тока телепотический аппарат починять пора, а лучше в металлолом сдать. Я знаю как так сделать, хоть и не внутри одной транзакции. Наверняка какими-нибудь недокументированными функциями можно и внутри транзакции сделать. Я не профессионал в MS SQL, чего -то могу и не знать.

invm
Более того, не понимаете, что такое блокировки, для чего они нужны и как связаны с транзакциями.

Ещё раз выбросите свой телепатический аппарат. Я может и не знаю всех тонкостей MS SQL, влом всё документацию помнить, но в отличии от вас знаю как базы на физическом уровне устроены. Только эту тему желательно не продолжать.

invm

Писатели мешают читателям? Используйте снепшотные уровни изоляций. Их для этого и придумали.

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

Явно никто из понтовщиков не может ничего путного по теме.

Вот и перешли на даже не на флуд, а на офтоп.
16 фев 16, 19:01    [18825733]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить