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

Откуда:
Сообщений: 96
Захожу в SQL server MS на первой закладке пишу запрос:
BEGIN TRANSACTION aaa
Insert into IPM_Objects -- WITH (UPDLOCK, ROWLOCK) 
  (ObjTypeId,Name,Adr,Code,DateSt,DateEn) 
   values  (2 ,     '1' ,     '1' ,     '1' ,     convert(datetime,'17.03.2014',104) ,     NULL ) 
--Rollback TRANSACTION aaa

Транзакцию не завершаю умышленно!
Захожу на вторую закладку пишу запрос:
select * from ipm_Objects

Запрос не выполняется до тех пор, пока на первой закладке не будет завершена транзакция.
Как сделать так, что бы SELECT на второй закладке выполнялся до завершения транзакции?
17 мар 14, 17:43    [15740287]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
_djХомяГ
Guest
Поуправлять уровнями изоляции - разрешить грязное чтение к примеру , атакже использовать подсказку readpast (если конечно это устраивает)
17 мар 14, 17:53    [15740367]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Ramzay_
Как сделать так, что бы SELECT на второй закладке выполнялся до завершения транзакции?
Вариантов несколько. Выбор зависит от того, хотите вы или нет видеть в результате "грязные" данные.
17 мар 14, 17:53    [15740369]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
Видеть грязные данные не обязательно. Если можно конкретный пример.
Или как разрешить грязное чтение? Пожалуйста, пример в студию.
17 мар 14, 18:04    [15740440]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
_djХомяГ
Guest
Табличный хинт NOLOCK
17 мар 14, 18:05    [15740448]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
Табличный хинт NOLOCK к инструкции Insert не применим.
17 мар 14, 18:10    [15740472]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
Изменение уровня изоляции не помогло:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION aaa
Insert into IPM_Objects WITH (UPDLOCK, PAGLOCK) 
  (ObjTypeId,Name,Adr,Code,DateSt,DateEn) 
   values  (2 ,     '1' ,     '1' ,     '1' ,     convert(datetime,'17.03.2014',104) ,     NULL ) 

--Rollback TRANSACTION aaa


Наминаю, что запрос
select * from ipm_Objects
выполнятеся вне транзакции!!!
Так вот это зарос не возвращает данные, до тех пор, пока транзакция aaa не закрыта.
Нужно получить данные, во время выполнения транзакции.
17 мар 14, 18:18    [15740523]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED[src][/SRC]

надо использовать во втором сеансе, который выбирает данные.
17 мар 14, 18:36    [15740643]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Ramzay_,

ваш селект пытается вернуть _все_ строки из таблицы. пока _хоть одна_ из строк таблицы заблокирована, он будет "висеть" - ожидать снятия блокировки. менять уровень изоляции у запроса с insert-ом нет никакого смысла. если и менять его - то у выбирающих запросов.
17 мар 14, 18:36    [15740646]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
нет, ну можно еще ход конем сделать - перевести базу в read committed snapshot.
17 мар 14, 18:39    [15740663]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
Ramzay_
Member

Откуда:
Сообщений: 96
daw, ну так бы сразу и сказал.
Все выбирается как нужно!
Спасибо большое!!!
17 мар 14, 18:56    [15740791]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция блокирует всю таблицу  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Ramzay_
Видеть грязные данные не обязательно.
Либо
select * from ipm_Objects with (readpast)

Либо включить у БД, как уже предлагалось, RCSI
17 мар 14, 18:58    [15740800]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить