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

Откуда:
Сообщений: 8768
Добрый день!
Скажите, пожалуйста MERGE блокирует таблицу или нет? Или есть вероятность из параллельных сессиий получить более 1 вставки с одинаковым ключом? Если да, то что лучше предпринять?
26 окт 11, 17:59    [11504936]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
netivan, наличие уникального констрейнта или индекса гарантирует вам, что повторы туда не попадут. если его не отключать
26 окт 11, 18:08    [11504994]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
netivan
Добрый день!
Скажите, пожалуйста MERGE блокирует таблицу или нет? Или есть вероятность из параллельных сессиий получить более 1 вставки с одинаковым ключом? Если да, то что лучше предпринять?


не поверите, но даже select накладывает блокировки. ключи разные бывают.
26 окт 11, 18:13    [11505014]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
Shakill
netivan, наличие уникального констрейнта или индекса гарантирует вам, что повторы туда не попадут. если его не отключать
ключ уникальный. Вот вопрос - при парллельном запросе может одновременно 2 условия в INSERT попасть или нет?
26 окт 11, 18:23    [11505072]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
netivan
при парллельном запросе может одновременно 2 условия в INSERT попасть или нет?

что это значит?
26 окт 11, 18:26    [11505087]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
netivan
Shakill
netivan, наличие уникального констрейнта или индекса гарантирует вам, что повторы туда не попадут. если его не отключать
ключ уникальный. Вот вопрос - при парллельном запросе может одновременно 2 условия в INSERT попасть или нет?

В инсерт попасть всё что угодно может.

Завязывайте с ребусами, что выплняется, какая структура таблиц ?
26 окт 11, 18:30    [11505116]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
Ken@t
netivan
пропущено...
ключ уникальный. Вот вопрос - при парллельном запросе может одновременно 2 условия в INSERT попасть или нет?

В инсерт попасть всё что угодно может.

Завязывайте с ребусами, что выплняется, какая структура таблиц ?

Хорошо, вот пример:

CREATE TABLE [dbo].[Table_1](
	[ID] [int] NOT NULL,
	[Descr] [nchar](100) NULL,
 CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
Процедура:
ALTER PROCEDURE [dbo].[PROC123]
	-- Add the parameters for the stored procedure here
@v int
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.

    MERGE dbo.Table_1 AS target
    USING (SELECT @v) AS source (ID)
    ON (target.id = source.id)
    WHEN MATCHED THEN 
        UPDATE SET descr = 'update_'+cast(GETDATE() as varchar)
	WHEN NOT MATCHED THEN	
	    INSERT (id, descr)
	    VALUES (@v,'new');
	   

END
Эта процедура вызывается одновременно из разных сессий. Есть вероятность что одновременно начнет выполняться 2 INSERt-a?
ЗЫ то что в этом случае будет ошибка это понятно.
26 окт 11, 18:34    [11505133]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
netivan,

оно в одной транзакции будет, кто последний того и тапки. С чего ошибка -то ? Да, а цель -то какая ?
26 окт 11, 18:43    [11505172]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
Ken@t
netivan,

оно в одной транзакции будет, кто последний того и тапки. С чего ошибка -то ? Да, а цель -то какая ?

вот такой я ответ и хотел вообщем услышать :) Цель достаточно простая - или вставить новую строку, или обновить существующую. как показано в примере А http://msdn.microsoft.com/ru-ru/library/bb510625.aspx .
26 окт 11, 18:48    [11505198]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Я бы MERGE обернул в TRY...CATCH и организовал обработку дедлоков.
26 окт 11, 19:04    [11505281]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Jovanny
Я бы MERGE обернул в TRY...CATCH и организовал обработку дедлоков.


о да, ахринтельно ,трай- катч зачем ? дедлоки как обрабатвать будет ?
26 окт 11, 19:16    [11505326]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
http://msdn.microsoft.com/ru-ru/library/ms179296.aspx
26 окт 11, 19:50    [11505471]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
У меня 5 джобов выполняют одну и ту же процедуру, и дедлоки иногда выскакивают. Несмотря на разные ухищрения, типа хинтов WITH(ROWLOCK, REPEATABLEREAD, READPAST) и отдельной таблицы с обрабатываемыми сейчас Id.
26 окт 11, 19:53    [11505489]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Jovanny
У меня 5 джобов выполняют одну и ту же процедуру, и дедлоки иногда выскакивают. Несмотря на разные ухищрения, типа хинтов WITH(ROWLOCK, REPEATABLEREAD, READPAST) и отдельной таблицы с обрабатываемыми сейчас Id.


Хм. анализировать не пытались причину дидлоков , ? ибо ловля оного в трай катч - как в носу ковыряться. Хинты вашы тоже сомнительны.

Собственно вопрос мой был Вам зачем в его конструкции трай катч и как вы обрабатываете дедлоки .
26 окт 11, 20:00    [11505528]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ken@t
Собственно вопрос мой был Вам зачем в его конструкции трай катч и как вы обрабатываете дедлоки .
try-catch - чтобы тупой реран транзакции сделать. Потому что если запрос не тяжелый, а дедлок раз в неделю или даже день - то проще реран сделать, чем разбираться.
26 окт 11, 20:11    [11505577]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гавриленко Сергей Алексеевич
Если .... проще реран сделать, чем разбираться.
Жарко у вас там.
Единственно что писал так это реран для таймаута локировки в административных скриптах (например всунуть/высунуть кусок данные в/из активный поток операций).

Непонятно причём тут MERGE вообще - это частность, и никакой разницы между остальными INSERT/UPDATE/DELETE не должно быть.

UPDATE тоже может заблокировать всю таблу (Full scan) и выставить оперции "в очередь" или приводить к дедлоку.
27 окт 11, 10:45    [11507019]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
Jovanny
Я бы MERGE обернул в TRY...CATCH и организовал обработку дедлоков.
ну я так понимаю , что для MERGE это необязательно, т.к. ошибки быть не может. Или я неверно понял?
27 окт 11, 10:51    [11507083]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
netivan
ну я так понимаю , что для MERGE это необязательно, т.к. ошибки быть не может. Или я неверно понял?

Для MERGE необязательно, но вероятность дедлока существует. Я бы сделал примерно следующее (как в BOL):

ALTER PROCEDURE [dbo].[PROC123]
	-- Add the parameters for the stored procedure here
@v int
	
AS
BEGIN

DECLARE @retry INT = 5;

WHILE (@retry > 0)
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;
    
		MERGE dbo.Table_1 AS target
		USING (SELECT @v) AS source (ID)
		ON (target.id = source.id)
		WHEN MATCHED THEN 
			UPDATE SET descr = 'update_'+cast(GETDATE() as varchar)
		WHEN NOT MATCHED THEN	
			INSERT (id, descr)
			VALUES (@v,'new');

        SET @retry = 0;

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH 
        IF (ERROR_NUMBER() = 1205)
            SET @retry = @retry - 1;
        ELSE
            SET @retry = -1;
  
        IF (XACT_STATE()) = -1
            ROLLBACK TRANSACTION;
    END CATCH;
END

END

В случае дедлока процедура будет 5 раз пытаться выполнить MERGE.
27 окт 11, 12:18    [11507919]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
вы можете объяснить - откуда дедлк возьмется? или я неправильно понимаю значения этого слова...
27 окт 11, 13:40    [11508760]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Ну, может и я чего-то не понимаю.

Почитайте http://msdn.microsoft.com/ru-ru/library/ms177433.aspx .

Т.е. Вы считаете, что здесь дедлока не может быть в принципе?
27 окт 11, 14:11    [11509062]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Т.е. предполагаете, что dbo.Table_1 всегда будет блокироваться на уровне строки?
27 окт 11, 14:21    [11509175]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
Jovanny
Т.е. предполагаете, что dbo.Table_1 всегда будет блокироваться на уровне строки?

Давайте разовьем эту тему. Приведите пример как там может быть взаимная блокировка. :)
27 окт 11, 15:09    [11509650]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Ну, например, такой скрипт, запущенный в двух сессиях, вызвал дедлок:

DECLARE @v int = 1, @i int = 1

WHILE @i < 1000000
BEGIN
MERGE dbo.Table_1 WITH(TABLOCK) AS target
    USING (SELECT @v) AS source (ID)
    ON (target.id = source.id)
    WHEN MATCHED THEN 
        UPDATE SET descr = 'update_'+cast(GETDATE() as varchar)
	WHEN NOT MATCHED THEN	
	    INSERT (id, descr)
	    VALUES (@v,'new');
SET @i += 1
END	    
 
27 окт 11, 16:04    [11510290]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
netivan
Member

Откуда:
Сообщений: 8768
Jovanny
Ну, например, такой скрипт, запущенный в двух сессиях, вызвал дедлок:

DECLARE @v int = 1, @i int = 1

WHILE @i < 1000000
BEGIN
MERGE dbo.Table_1 WITH(TABLOCK) AS target
    USING (SELECT @v) AS source (ID)
    ON (target.id = source.id)
    WHEN MATCHED THEN 
        UPDATE SET descr = 'update_'+cast(GETDATE() as varchar)
	WHEN NOT MATCHED THEN	
	    INSERT (id, descr)
	    VALUES (@v,'new');
SET @i += 1
END	    
 

ну скрипт дело десятое, на словах поясни. У нас используется одна Таблица Т1. Транзакция 1 накладывает на нее блокировку , вторая ждет. Вроде никаких вложенных блокировок нет. Вроде как для дедлока нужно 2 объекта :) Я вообщем рассуждаю с точки зрения программирования, в БД над дедлоками никогда не задумывался. Прошу пояснить на этом примере, кто что лочит.
27 окт 11, 16:29    [11510543]     Ответить | Цитировать Сообщить модератору
 Re: Merge и блокировка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
netivan
Вроде как для дедлока нужно 2 объекта
Две записи (как, впрочем, и две страницы) одной и той же таблицы вполне сгодятся.
27 окт 11, 16:36    [11510629]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить