Запрос на выбор SQL-сервера с NOLOCK не работает - PullRequest
0 голосов
/ 02 апреля 2012

У меня следующий запрос

 SELECT *
  FROM T1 with (NOLOCK )

Выборочный запрос может идти куда угодно, поскольку пользователь (I) делает это.

И мой прикладной скрипт вставляет 1000 строк данных и удаляет старый: Все эти утверждения находятся внутри моего кода Java. И вставка - пакетная вставка.

- Я установил здесь autocommit false

truncate table T1
insert into table T1 values(x,y,z)
truncate table T2
insert into table T2 values(x,y,z)...and other

--Я фиксирую транзакцию здесь

Но я не получаю данные от T1, пока усечение и вставка не будут завершены.Как можно избежать такой ситуации?

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Вам следует подумать о замене операторов INSERT INTO на BULK INSERT .Также рассмотрите возможность изменения уровней изоляции транзакций до и восстановления после запуска ваших сценариев, таких как

alter database mydb set READ_COMMITTED_SNAPSHOT ON

или даже

alter database mydb set READ_UNCOMMITED_SNAPSHOT ON

. Это фактически позволит вам полностью избавиться от операторов NOLOCK.

0 голосов
/ 02 апреля 2012

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

truncate table T1
insert into table T1 values(x,y,z)

**data available for dirty read on T1 here **

truncate table T2
insert into table T2 values(x,y,z)...and other

, вы можете проверить, что я имею в виду, выполнив это:

truncate table T1
insert into table T1 values(x,y,'My test values')
**read data here**
insert into table T1 values(x,y,z)

если вы запустите грязное чтение на прочитайте данные здесь вы сможете увидеть «Мои тестовые значения»

0 голосов
/ 02 апреля 2012

ВЫБРАТЬ * ОТ T1 (NOLOCK)

Пропустить "с".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...