Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Грязное чтение из виртуальных таблиц(режим NOLOCK) (число прочтений - 4987 )
Sirus_Virus
YaBB Newbies
*
Отсутствует


1C - зло О_о

Сообщений: 13
Местоположение: Нск
Зарегистрирован: 06. Июня 2008
Пол: Мужской
Грязное чтение из виртуальных таблиц(режим NOLOCK)
09. Июня 2008 :: 04:55
Печать  
Можно ли как то этого добиться?  Нерешительный

Код вида:

Код
Выбрать все
	|DECLARE @Товар CHAR(9)
	|SET @Товар = ?
	|SELECT
	|   SUM(Рег.ОстатокТовараОстаток)	as ОстатокТовара,
	|	SUM(Рег.РезервТовараОстаток)	as РезервТовара
	|FROM
	|	$РегистрОстатки.ОтгрузкаТоваров(:ДатаРасчета~,,Склад = :ВыбСклад AND Товар = @Товар,, (ОстатокТовара,РезервТовара)) as Рег
 



Работает прекраснейшим образом, но при добавлении WITH (NOLOCK) матерится гад.

Код
Выбрать все
	|DECLARE @Товар CHAR(9)
	|SET @Товар = ?
	|SELECT
	|   SUM(Рег.ОстатокТовараОстаток)	as ОстатокТовара,
	|	SUM(Рег.РезервТовараОстаток)	as РезервТовара
	|FROM
	|	$РегистрОстатки.ОтгрузкаТоваров(:ДатаРасчета~,,Склад = :ВыбСклад AND Товар = @Товар,, (ОстатокТовара,РезервТовара)) as Рег WITH (NOLOCK)
 



State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'WITH'.
  

Владей собой среди толпы смятенной, &&Тебя клянущей за смятенье всех, &&Верь сам в себя, наперекор вселенной, &&И маловерным отпусти их грех... &&&&(с) Редьярд Киплинг&&
Наверх
 
IP записан
 
spenov
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 119
Зарегистрирован: 18. Января 2008
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #1 - 09. Июня 2008 :: 05:39
Печать  
надо включить режим отладки Запрос.Отладка(1), посмотреть на реально выполняющийся запрос и все станет понятно Улыбка там большая конструкция.
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #2 - 09. Июня 2008 :: 05:47
Печать  
во всех вирт таблицах nolock по умолчанию
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #3 - 09. Июня 2008 :: 05:47
Печать  
Не надо там писать WITH (NOLOCK), это виртуальная таблица и все подсказки оптимизатору там уже выставлены. Т.е. чтение и так грязное.
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #4 - 09. Июня 2008 :: 09:41
Печать  
Подумал что это Арта спрашивает и испужался  Подмигивание
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #5 - 09. Июня 2008 :: 15:13
Печать  
А в чем вопрос?
1С не даст прочитать данные даже с Nolock, потому как просиходит TablockX, если не ошибаюсь, что делает невозможным получения грязных данных.
  
Наверх
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #6 - 10. Июня 2008 :: 13:37
Печать  
pvase писал(а) 09. Июня 2008 :: 15:13:
А в чем вопрос?
1С не даст прочитать данные даже с Nolock, потому как просиходит TablockX, если не ошибаюсь, что делает невозможным получения грязных данных.


В одной сессии QA это:
Код
Выбрать все
SET NOCOUNT ON
GO

IF OBJECT_ID(N'ДляВаси') IS NOT NULL DROP TABLE ДляВаси
GO

CREATE TABLE ДляВаси (
	id int IDENTITY(1, 1) NOT NULL CONSTRAINT PK_ID PRIMARY KEY CLUSTERED,
	descr varchar(255)  NOT NULL
)
GO

SET IDENTITY_INSERT ДляВаси ON
GO

INSERT INTO ДляВаси (id, descr)
	SELECT 1, 'Хинт'
	UNION
	SELECT 2, 'NOLOCK'
	UNION
	SELECT 3, 'может'
	UNION
	SELECT 4, 'читать, когда есть'
	UNION
	SELECT 5, 'TablockX'
GO

SET IDENTITY_INSERT ДляВаси OFF
GO

BEGIN TRAN
SELECT * FROM ДляВаси (TABLOCKX, HOLDLOCK) WHERE 1 = 1 ORDER BY id

DELETE FROM ДляВаси WHERE id = 1

SELECT * FROM ДляВаси (TABLOCKX, HOLDLOCK) WHERE 1 = 1 ORDER BY id
GO

--ROLLBACK TRAN
 



А в другой это:
Код
Выбрать все
SELECT * FROM ДляВаси (NOLOCK) 

  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #7 - 10. Июня 2008 :: 15:04
Печать  
nolock - это и есть "грязное" чтение
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Грязное чтение из виртуальных таблиц(режим NOL
Ответ #8 - 11. Июня 2008 :: 14:38
Печать  
Ну тогда 1С всегда читает гряные данные в отчетах (потому как NOLOCK ставит).
И все же не совсем понятно, что надо автору, когда не читать грязные данные, если в проведении документа, то их грязных не будет (если нет гибких блокировок). А если в отчете - то можно самому писать запросы, если это очень критично.
« Последняя редакция: 11. Июня 2008 :: 18:54 - pvase »  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать