Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как заблокировать таблицу на время. И как её потом отпустить  [new]
Диам
Member

Откуда:
Сообщений: 1497
Здравствуйте, для теста нужно таблицу заблокировать, чтобы никто не мог ни прочитать, ни записать в неё на некоторое время. А потом разлочить. Как можно это сделать?
29 май 15, 17:12    [17707834]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Диам,

можно права на чтение и запись запретить, тогда транзакции висеть не будут, сразу ошибка доступа.
29 май 15, 17:19    [17707859]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Диам
Здравствуйте, для теста нужно таблицу заблокировать, чтобы никто не мог ни прочитать, ни записать в неё на некоторое время. А потом разлочить. Как можно это сделать?


Вы вот так хотите?

 BEGIN TRANSACTION

  -- lock table "a" till end of transaction
  SELECT ...
  FROM a
  WITH (TABLOCK, HOLDLOCK)
  WHERE ...

  -- do some other stuff (including inserting/updating table "a")



  -- release lock
  COMMIT TRANSACTION
29 май 15, 17:24    [17707877]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
o-o
Guest
Владислав Колосов
Диам,
можно права на чтение и запись запретить, тогда транзакции висеть не будут, сразу ошибка доступа.

какая же это блокировка?
запретить можно лишь тому, у кого права проверяются, остальные доступ поимеют (dbo)
29 май 15, 17:31    [17707913]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
Диам
Member

Откуда:
Сообщений: 1497
a_voronin,
спасибо за ответ.
Выполняю в ssms:
 BEGIN TRANSACTION
		-- lock table "a" till end of transaction
		while 1=1
			SELECT *
			FROM DocumentsInUse
			WITH (TABLOCK, HOLDLOCK)
			--WHERE 12=2

  -- do some other stuff (including inserting/updating table "a")
  -- release lock
  COMMIT TRANSACTION


В другом окне выполняю
select * from DocumentsInUse

и вполне успешно.....
29 май 15, 17:51    [17708007]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
Диам
Member

Откуда:
Сообщений: 1497
т.е. блокировки не произошло.
29 май 15, 17:51    [17708012]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Диам
и вполне успешно.....
Вполне не удивительно.

Во-первых, цикл не нужен.
Во-вторых нужно:
begin tran;

declare @v int;
select top (0) @v = 1 from DocumentsInUse with (tablockx)

Когда нужно будет отпустить - просто завершить транзакцию.
29 май 15, 18:07    [17708083]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
begin tran
drop table  a

Далее, если есть желание, чтобы таблицу никто не мог ни прочитать, ни записать в неё вообще никогда, можно и закомиттить.
29 май 15, 18:08    [17708089]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Но с nolock и снепшотные TIL все равно смогут читать. Если и это надо закрыть, то придется в транзакции выполнить вместо select любой "безвредный" DDL над таблицей.
29 май 15, 18:17    [17708107]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
Диам
Member

Откуда:
Сообщений: 1497
Гавриленко Сергей Алексеевич,

Спасибо. Получилось.
29 май 15, 18:17    [17708109]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
тоже интересно
Guest
invm
Но с nolock и снепшотные TIL все равно смогут читать. Если и это надо закрыть, то придется в транзакции выполнить вместо select любой "безвредный" DDL над таблицей.
Так?
begin tran;
  alter table MyTable
  add TmpField int null

  < Монопольные действия с таблицей >

  alter table MyTable
  drop column TmpField
commit tran
29 май 15, 18:34    [17708168]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Диам
a_voronin,
спасибо за ответ.
Выполняю в ssms:
 BEGIN TRANSACTION
		-- lock table "a" till end of transaction
		while 1=1
			SELECT *
			FROM DocumentsInUse
			WITH (TABLOCK, HOLDLOCK)
			--WHERE 12=2

  -- do some other stuff (including inserting/updating table "a")
  -- release lock
  COMMIT TRANSACTION


В другом окне выполняю
select * from DocumentsInUse

и вполне успешно.....



Вы выполните в первом окне

BEGIN TRANSACTION
		-- lock table "a" till end of transaction
		while 1=1
			SELECT *
			FROM DocumentsInUse
			WITH (TABLOCK, HOLDLOCK)
			--WHERE 12=2


Потом выполните во втором окне

select * from DocumentsInUse


И только потом выполните в первом
 -- release lock
  COMMIT TRANSACTION
29 май 15, 19:46    [17708347]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
o-o
Guest
invm
Во-первых, цикл не нужен.

a_voronin -- человек серьезный, мелочиться не любит.
если "500 лямов" не прогонит,
хотя бы и просто так, день прожит напрасно
29 май 15, 21:51    [17708652]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
тоже интересно
Так?
begin tran;
  alter table MyTable
  add TmpField int null

  < Монопольные действия с таблицей >

  alter table MyTable
  drop column TmpField
commit tran
Можно гуманнее:
begin tran;
  alter table MyTable set (lock_escalation = auto);
  < Монопольные действия с таблицей >
commit tran
29 май 15, 21:54    [17708662]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
a_voronin
Вы выполните в первом окне

BEGIN TRANSACTION
		-- lock table "a" till end of transaction
		while 1=1
			SELECT *
			FROM DocumentsInUse
			WITH (TABLOCK, HOLDLOCK)
Зачем бесконечный цикл?
TABLOCK, HOLDLOCK - это S-блокировка на таблицу + serializable. Так что совершенно не понятно, за счет чего конкурирующие сеансы не смогут эту таблицу читать.
29 май 15, 21:58    [17708674]     Ответить | Цитировать Сообщить модератору
 Re: как заблокировать таблицу на время. И как её потом отпустить  [new]
o-o
Guest
invm,

ну как зачем, чтоб данные в студии мелькали,
чтоб было ясно, а оно все еще живо или как? :)
29 май 15, 22:00    [17708677]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить