Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
ЭстЪ тривиальный select, который генерит ORM'ка, а-ля:
select
	N0."id",N0."idSmthI",N1."FieldI",N0."FieldI",N0."FieldII",N0."idSmthII",N0."FieldIII",N0."FieldIV"
from
(
	"dbo"."TableI" N0 with (nolock)
	left join "dbo"."TableII" N1 with (nolock) on (N0."idSmthI" = N1."id")
)
where
(
	N0."idSmthII" in (@p0,@p1,...,@p84)
	and (N0."FieldI" = @p85)
)

который отваливается по timeout'у (кол-во параметров - варьируется и, IMHO, не принципиально). Прочитал, потестил:
set transaction isolation level read committed
begin tran

select * from TestTable4ReadLock where Value = 100

-- rollback

висит
set transaction isolation level read committed
begin tran

select * from TestTable4ReadLock with (nolock) where Value = 100

-- rollback

выполняется без проблем, равно как и
set transaction isolation level read uncommitted
begin tran

select * from TestTable4ReadLock where Value = 100

-- rollback


Параллельно с выше приведенным ORM'ным select'ом шла довольно-таки довольно активная работа с TableI (массовые insert'ы и немногочисленные update'ы предположительно пакетные). Раз в 5 мин дергается SP'шка логирующая блокировки - во время выполнения select'а - все сухо. Почему же тогда отваливается выше приведенный select? Пакетные insert'ы/update'ы блокируют системные вещи (индекса etc.) перед которыми даже dirty read пасует? Или ЭстЪ/м.б. какие-либо еще другие причины?
_________________
"Helo, word!" - 17 errors 56 warnings
21 окт 15, 22:27    [18309348]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
1. nolock не означает, что блокировки вообще не накладываются.
2. Отлавливаете spid подвисшей сессии и смотрите чего она ждет в sys.dm_os_waiting_tasks
21 окт 15, 22:38    [18309371]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
idSmthIV_jr
Guest
Ex_Soft,

автор
кол-во параметров - варьируется и, IMHO, не принципиально

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

таймаут точно с блокировками связан?
может сервер просто не успевает ваш запрос выполнить пока занят "пакетами с апдейтами и инсертами"? он в blocked точно числится?
21 окт 15, 22:46    [18309391]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
invm
1. nolock не означает, что блокировки вообще не накладываются.

Вы подразумеваете блокировки при чтении? Или блокировки которые накладываются при insert'е/update?
https://msdn.microsoft.com/en-us/library/ms173763(v=sql.110).aspx
READ UNCOMMITTED

Specifies that statements can read rows that have been modified by other transactions but not yet committed.

Transactions running at the READ UNCOMMITTED level do not issue shared locks to prevent other transactions from modifying data read by the current transaction. READ UNCOMMITTED transactions are also not blocked by exclusive locks that would prevent the current transaction from reading rows that have been modified but not committed by other transactions. When this option is set, it is possible to read uncommitted modifications, which are called dirty reads. Values in the data can be changed and rows can appear or disappear in the data set before the end of the transaction. This option has the same effect as setting NOLOCK on all tables in all SELECT statements in a transaction. This is the least restrictive of the isolation levels.

https://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx
Exclusive Locks

Exclusive (X) locks prevent access to a resource by concurrent transactions. With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level.

Data modification statements, such as INSERT, UPDATE, and DELETE combine both modification and read operations. The statement first performs read operations to acquire data before performing the required modification operations. Data modification statements, therefore, typically request both shared locks and exclusive locks. For example, an UPDATE statement might modify rows in one table based on a join with another table. In this case, the UPDATE statement requests shared locks on the rows read in the join table in addition to requesting exclusive locks on the updated rows.

invm
2. Отлавливаете spid подвисшей сессии и смотрите чего она ждет в sys.dm_os_waiting_tasks

Дык как же его отловить-то когда меня уже ORM ставит перед фактом на клиенте System.Data.SqlClient.SqlException'ом (а вся подноготная у неё в её недоступных потрохах)?
+ повторюсь
Ex_Soft
Раз в 5 мин дергается SP'шка логирующая блокировки - во время выполнения select'а - все сухо.
21 окт 15, 23:19    [18309452]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
idSmthIV_jr
как раз и может быть радикально принципиально. ок, допустим ничего неожиданного не появляется в этих параметрах.

да сам запрос (падение логируется, включая сам запрос как таковой) из-под M$ SSMS выполняется шустро и без проблем - т.е. сам он по себе - не долгоиграющий.
idSmthIV_jr
таймаут точно с блокировками связан?

Не - не точно. Я, вот, как раз хочу выяснить, что еще может служить причиной.
idSmthIV_jr
может сервер просто не успевает ваш запрос выполнить пока занят "пакетами с апдейтами и инсертами"?

ну... если судить по другим логам (вносимых изменений, perfomance) - то другие операции на других таблицах выполняются...
idSmthIV_jr
он в blocked точно числится?

1. Числится или НЕ числится?
2. Как в этом можно удостовериться?
21 окт 15, 23:28    [18309465]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Ex_Soft
Вы подразумеваете блокировки при чтении? Или блокировки которые накладываются при insert'е/update?
При nolock на таблицу будет накладываться блокировка стабильности схемы Sch-S. Если на таблицу параллельными сессиями наложены несовместимые с ней блокировки - получите ожидание.
Ex_Soft
Дык как же его отловить-то когда меня уже ORM ставит перед фактом на клиенте System.Data.SqlClient.SqlException'ом (а вся подноготная у неё в её недоступных потрохах)?
Выполняющиеся в данный момент запросы можно посмотреть с помощью sys.dm_exec_requests и sys.dm_exec_sql_text, найти проблемный и посмотреть ожидания.
Ex_Soft
+ повторюсь
Ex_Soft
Раз в 5 мин дергается SP'шка логирующая блокировки - во время выполнения select'а - все сухо.
Что именно логирует эта "SP'шка" и каким образом - тайна, покрытая мраком.

Может и нет никаких ожиданий. Возможно, например, из-за протухшей статистики, для запроса сгенерился план, который при выполнении будет лопатить половину БД.
Или какой-нибудь доброхот "наоптимизировал" индексы. И т.д. и т.п.

В любом случае надо анализировать происходящее, а не уповать на результат "логирующей SP'шки".
21 окт 15, 23:50    [18309528]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
invm
При nolock на таблицу будет накладываться блокировка стабильности схемы Sch-S.

Да?..
https://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx
Schema Locks

The Database Engine uses schema modification (Sch-M) locks during a table data definition language (DDL) operation, such as adding a column or dropping a table. During the time that it is held, the Sch-M lock prevents concurrent access to the table. This means the Sch-M lock blocks all outside operations until the lock is released.

Some data manipulation language (DML) operations, such as table truncation, use Sch-M locks to prevent access to affected tables by concurrent operations.

The Database Engine uses schema stability (Sch-S) locks when compiling and executing queries. Sch-S locks do not block any transactional locks, including exclusive (X) locks. Therefore, other transactions, including those with X locks on a table, continue to run while a query is being compiled. However, concurrent DDL operations, and concurrent DML operations that acquire Sch-M locks, cannot be performed on the table.

Вы об этом? Где об этом можно почитать поподробнее?
invm
Если на таблицу параллельными сессиями наложены несовместимые с ней блокировки - получите ожидание.

Несовместимые equ Недопустимые? Потому как согласно этому Sch-S конфликтует только с Sch-M, и недопустима с RS-S ... RX-X.
invm
Выполняющиеся в данный момент запросы можно посмотреть с помощью sys.dm_exec_requests и sys.dm_exec_sql_text, найти проблемный и посмотреть ожидания.

Еще раз повторяю - разбор полётов ведется так сказать постфактум - анализируются логи приложения на предмет наличия там каких либо exception'ов. Связанный с timeout'ом System.Data.SqlClient.SqlException появился относительно недавно и не разовый; появляется рандомайзно, но на одном и том же запросе. Причём, как правило, этот запрос успешно выполняется по многу раз в день. Но, вот, при некоторых стечениях обстоятельств - отваливается.
invm
Что именно логирует эта "SP'шка" и каким образом - тайна, покрытая мраком.

Ну... Не такая уж это и тайна - insert'ит в таблицу результат сего select'а
	SELECT
		getdate() as Info_DateTime,
		DB_NAME(b.dbid) as DatabaseName,
		b.spid as Waiting_SPID,
		s.spid as Locking_SPID, 
		s.blocked as Locking_BlockSPID, 
		b.waittime / 1000 as Waiting_Time,
		datediff(ss, s.last_batch, getdate()) as Locking_Time, 
		b.lastwaittype as Waiting_LastWaitType,
		OBJECT_NAME(l.rsc_objid, l.rsc_dbid) as Waiting_ForObject,
		CAST(slock.text AS VARCHAR(MAX)) as Locking_Statement,
		CAST(block.text AS VARCHAR(MAX)) as Waiting_Statement,
		case req_mode 
			when 0 then ''
			when 1 then 'Sch-S'
			when 2 then 'Sch-M'
			when 3 then 'S'
			when 4 then 'U'
			when 5 then 'X'
			when 6 then 'IS'
			when 7 then 'IU'
			when 8 then 'IX'
			when 9 then 'SIU'
			when 10 then 'SIX'
			when 11 then 'UIX'
			when 12 then 'BU'
			when 13 then 'RangeS_S'
			when 14 then 'RangeS_U'
			when 15 then 'RangeI_N'
			when 16 then 'RangeI_S'
			when 17 then 'RangeI_U'
			when 18 then 'RangeI_X'
			when 19 then 'RangeX_S'
			when 20 then 'RangeX_U'
			when 21 then 'RangeX_X'
		end as Waiting_WaitType,
		req_transactionid as Waiting_TransactionID,
		b.program_name as Waiting_ProgramName, 
		b.loginame as Waiting_LoginName,
		s.program_name as Locking_ProgramName, 
		s.loginame as Locking_LoginName
		,SUBSTRING (block.text, (cn_b.statement_start_offset/2) + 1
		 , ((CASE WHEN cn_b.statement_end_offset = -1 
			 THEN LEN(CONVERT(NVARCHAR(MAX), slock.text)) * 2 
			   ELSE cn_b.statement_end_offset
			 END - cn_b.statement_start_offset)/2) + 1) AS [Waiting Query]
		,SUBSTRING (slock.text, (cn_s.statement_start_offset/2) + 1
		 , ((CASE WHEN cn_s.statement_end_offset = -1 
			 THEN LEN(CONVERT(NVARCHAR(MAX), slock.text)) * 2 
			   ELSE cn_s.statement_end_offset
			 END - cn_s.statement_start_offset)/2) + 1) AS [Locking Query]
	FROM sys.sysprocesses as b
	inner join sys.sysprocesses s on b.blocked = s.spid
	left join sys.dm_exec_requests as cn_b on cn_b.session_id = b.spid
	left join sys.dm_exec_requests as cn_s on cn_s.session_id = s.spid
	outer APPLY sys.dm_exec_sql_text (s.sql_handle) as slock
	outer apply sys.dm_exec_sql_text (b.sql_handle) as block
	inner join sys.syslockinfo as l on b.spid = l.req_spid
	WHERE b.spid >= 50 and b.blocked > 0 and b.waittime > 30000
		and l.req_status = 3

invm
Может и нет никаких ожиданий. Возможно, например, из-за протухшей статистики, для запроса сгенерился план, который при выполнении будет лопатить половину БД.
Или какой-нибудь доброхот "наоптимизировал" индексы. И т.д. и т.п.

Ex_Soft
idSmthIV_jr
таймаут точно с блокировками связан?

Не - не точно. Я, вот, как раз хочу выяснить, что еще может служить причиной.

А, вот, в сторну "наоптимизированных" индексов - как идентифицировать, что с ними мягко выражовываясь перемудрили?
invm
В любом случае надо анализировать происходящее, а не уповать на результат "логирующей SP'шки".

Еще раз повторяю - об отвале узнаем из логов. Это события уже дано минувших дней. По сему тока на все создаваемые логи у уповаем.
22 окт 15, 08:15    [18309772]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
o-o
Guest
Ex_Soft
invm
При nolock на таблицу будет накладываться блокировка стабильности схемы Sch-S.

Да?..

Почему бы самому не убедиться?
Демонстрирую на системной таблице, к-ая у всех есть,
а вы возьмите любую пользовательскую, соедините нужно число раз, чтобы подольше думало,
в соседнем окне dm_tran_locks отфильтруйте по той сессии,
запустите еще до запроса по таблице, убедитесь, на таблице нет блокировок.
Потом ту байду запустите и наблюдайте, как висит shs-s все время выполнения запроса

К сообщению приложен файл. Размер - 59Kb
22 окт 15, 09:15    [18309874]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
o-o
Почему бы самому не убедиться?

THNX - убедился. Причем Sch-S не зависит от наличия отсутствия/присутствия nolock. Как это мне пожет помочь в решении проблемы?
22 окт 15, 09:37    [18309981]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Еще раз повторяю - об отвале узнаем из логов.

И как отваливание по заданному _клиентом_ таймауту показывает причину долго выполнения запроса ?
22 окт 15, 09:39    [18309993]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Eleanor
Member

Откуда:
Сообщений: 2912
Ex_Soft
Еще раз повторяю - разбор полётов ведется так сказать постфактум - анализируются логи приложения на предмет наличия там каких либо exception'ов

А профайлер вы запустить можете или server side trace, чтобы отследить причину когда проблема снова повторится?
Включить Blocked Process Threshold, например, на 5 сек и отследить событие Errors and Warnings\Blocked process report
22 окт 15, 09:48    [18310049]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
И как отваливание по заданному _клиентом_ таймауту показывает причину долго выполнения запроса ?

Никак. Это просто тревожный звоночек, что не все ладно в королевстве Датском. А поскольку он не единичен и прослеживается тенденция - причину отваливания как раз и пытаемся идентифицировать. А сам запрос
Ex_Soft
да сам запрос (падение логируется, включая сам запрос как таковой) из-под M$ SSMS выполняется шустро и без проблем - т.е. сам он по себе - не долгоиграющий.

Eleanor
А профайлер вы запустить можете или server side trace, чтобы отследить причину когда проблема снова повторится?
Включить Blocked Process Threshold, например, на 5 сек и отследить событие Errors and Warnings\Blocked process report

Лично я - нЭт (я даже не знаю где географически расположен сервант). И доступа к нему у меня ессесно - нЭт. Погрю с нашими басистами. Да и 5 сек... Та "покрытая тайной" SP'ка, логирующая локи, запускается раз в 5 мин - чаще слижком уж затратно (как мне пояснили). БД довольно-таки довольно высоконагруженная. Помимо того клиентского приложения о котором веду речь - еще куча всяких других + репликации, job'ы, сервисы... И вот за две недели - 22 случая (рандомайзно по времени в разные 5 дней). Попробуй тут отлови... Не был бы 1:1 запрос во всех случаях - отнеслись бы положительно (производная от слова "положить") Картинка с другого сайта. А так - нуна выяснить...
22 окт 15, 10:11    [18310183]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Никак. Это просто тревожный звоночек, что не все ладно в королевстве Датском. А поскольку он не единичен и прослеживается тенденция - причину отваливания как раз и пытаемся идентифицировать.

Ну так для это не начинают дискутировать про блокировки на форуме.
Для этого включают трассировку/мониторинг того, что происходит на сервере в тот момент
22 окт 15, 10:14    [18310201]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
Для этого включают трассировку/мониторинг того, что происходит на сервере в тот момент

Ну... машину времени еще, насколько мне известно, - не изобрели... А постоянно держать "... трассировку/мониторинг того, что происходит на сервере в тот момент..." на и так высоконагруженном проме слижком уж дорогое удовольствие, IMHO...
Ex_Soft
за две недели - 22 случая (рандомайзно по времени в разные 5 дней)
22 окт 15, 10:21    [18310248]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Ну... машину времени еще, насколько мне известно, - не изобрели... А постоянно держать "... трассировку/мониторинг того, что происходит на сервере в тот момент..." на и так высоконагруженном проме слижком уж дорогое удовольствие, IMHO...

Вы что хотите силой мысли в процессе дискуссии узнать причину замедления выполнения именно этого запроса ?
Давайте полечим глухонемого больного по телефону, а то он уже 22 раза мычал ?

Сообщение было отредактировано: 22 окт 15, 10:25
22 окт 15, 10:25    [18310289]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Eleanor
Member

Откуда:
Сообщений: 2912
Ex_Soft
Погрю с нашими басистами. Да и 5 сек... Та "покрытая тайной" SP'ка, логирующая локи, запускается раз в 5 мин - чаще слижком уж затратно

Blocked Process Threshold можно любой выставить. Зависит от того, какой у вас период таймаута выставлен.
Таймаут у вас точно больше 5 минут, чтобы SP'ка могла отловить блокировки?

А вообще базисты должны сами разбираться в таких случаях.
22 окт 15, 10:31    [18310345]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
Вы что хотите силой мысли в процессе дискуссии узнать причину замедления выполнения именно этого запроса ?

Я хочу в процессе дискуссии узнать все возможные причины
InnerException Message: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
InnerException StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)

Уже озвучены:
1. Блокировки
2. "... какой-нибудь доброхот "наоптимизировал" индексы ..."

Какие еще возможные причины назовете Вы?

Eleanor
Таймаут у вас точно больше 5 минут, чтобы SP'ка могла отловить блокировки?
Timeout, который выставляет ORM 1000%-но 5 мин
        public virtual IDbCommand CreateCommand()
        {
            this.OpenConnection();
            IDbCommand command = this.Connection.CreateCommand();
            command.Connection = this.Connection;
            command.Transaction = this.Transaction;
            command.CommandTimeout = 300;
            return command;
        }

а, вот, то, что SP'шка, логирующая локи, дергается с периодом 5 мин - это мне просто сказали и принял на веру.
22 окт 15, 10:48    [18310439]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Какие еще возможные причины назовете Вы?

Причина, например, слишком маленький таймаут. Легче стало ?
22 окт 15, 10:52    [18310460]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
этож бубльгхум
Guest
Ex_Soft,

автор
Какие еще возможные причины назовете Вы?

например, кто-нибудь фильм качает.
или вон те массовые инсерты и апдейты по тому же каналу пихаются.
22 окт 15, 10:53    [18310470]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
o-o
Guest
Ex_Soft
o-o
Почему бы самому не убедиться?

THNX - убедился. Причем Sch-S не зависит от наличия отсутствия/присутствия nolock. Как это мне пожет помочь в решении проблемы?

это было не к решению проблемы, а в доказательство сказанного invm.
т.к. неправильно заявлять, что "при read uncommitted никаких блокировок не накладывается",
это S не накладывается, а что это не единственная блокировка при чтении почему-то все забывают
22 окт 15, 11:00    [18310514]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
Причина, например, слишком маленький таймаут. Легче стало ?

OK - добавим в список.
Но:
- запрос не долгоиграющий
- запрос с этим timeout'ом практически всегда выполняется без проблем
- до часа "Ч" все было сухо

этож бубльгхум
например, кто-нибудь фильм качает.
или вон те массовые инсерты и апдейты по тому же каналу пихаются.

Ну... Если бы проблемы были на транспортном уровне, т.е. он бы наглухо заперся, - то, по идее, должно было бы быть
System.Data.SqlClient.SqlException (0x80131904): A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.) ---> System.ComponentModel.Win32Exception (0x80004005): The semaphore timeout period has expired

а если хоть что-то пробулькивает - timeout, так сказать, "отодвигается".
22 окт 15, 11:04    [18310535]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ex_Soft
Но:
- запрос не долгоиграющий

Любой запрос можно заставить выполняться бесконечно долго.
Вы же сами привели условия блокировки для вашего nolock.
22 окт 15, 11:07    [18310547]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
o-o
т.к. неправильно заявлять, что "при read uncommitted никаких блокировок не накладывается"

Ну... Я лично этого не заявлял (поскольку не позиционирую себя как басиста) - я просто цицировал доку.
o-o
это S не накладывается, а что это не единственная блокировка при чтении почему-то все забывают

вот и я ж о чем
Ex_Soft
Где об этом можно почитать поподробнее?
22 окт 15, 11:09    [18310556]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7710
Glory
Любой запрос можно заставить выполняться бесконечно долго.
Вы же сами привели условия блокировки для вашего nolock.

Т.е. Вы хотите сказать, что те параллельно выполняющиеся пакетные insert'ы/update'ы выставляют какую-либо RS-S...RX-X блокировку и select ждет чтобы поставить свою Sch-S?
22 окт 15, 11:39    [18310751]     Ответить | Цитировать Сообщить модератору
 Re: select with (nolock) отваливается по timeout'у  [new]
o-o
Guest
Ex_Soft
Ex_Soft
Где об этом можно почитать поподробнее?

подробнее не знаю,
а разве мало написанного
автор
The Database Engine uses schema stability (Sch-S) locks when compiling and executing queries.
Sch-S locks do not block any transactional locks, including exclusive (X) locks.
Therefore, other transactions, including those with X locks on a table, continue to run while a query is being compiled.
However, concurrent DDL operations, and concurrent DML operations that acquire Sch-M locks, cannot be performed on the table

Sch-S для того, чтобы конфликтовать со Sch-M.
ну т.е. пока вы читаете/обновляете, т.е. запускаете DML statements,
никто не может дропать колонки таблицы, с к-ой работаете, или подменять ее.
например, вы индексы онлайново перестраиваете.
для примера пускай мы кластерный онлайново ребилдим.
таблица доступна во время процесса,
но если вы ее ни на секунду не отпускаете, ваш онлайновый ребилд будет висеть и висеть.
потому что он уже все отребилдил, но ему надо "подменить" таблицу, нужен Sch-M,
поэтому он стоит в очереди и ждет, когда отвалится Sch-S
22 окт 15, 11:40    [18310763]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить