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

Откуда:
Сообщений: 9
Доброго времени суток.
Ищу совет по предотвращении дублировании данных в распределенных секцированных представлениях.
На данный момент у меня есть функция проверки(применяется в пределах хранимой процедуры) которая ищет наличие записи по соотв. параметрам но это слишком не надежный вариант, так как при достаточной нагрузке несколько потоков могут паралельно инициировать выполнение хранимой процедуры на вставку.
Можно ли поместить саму функцию поиска дубликатов в транзакцию на вставку с хином TABLOCKX(и/или HOLDLOCK) тем самым блокируя таблицы до окончания транзакции. Насколько тогда высока вероятность дедлока? Есть ли другие более адекватные возможности борьбы с возможным дублированием?

Заранее благодарю за конструктивные предложения.
28 ноя 16, 12:53    [19942470]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Триггер instead of insert на представление. В нем sp_getapplock для сериализации вставок в таблицу и проверка на дубликаты.
28 ноя 16, 13:36    [19942636]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
ssdt_user,

абсолютно непонятно - откуда у Вас дублирование. Очевидно, под "секционированием" Вы что-то другое понимаете. Секционированные представление не допускают дубли между секциями в силу физических ограничений.
28 ноя 16, 14:06    [19942801]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
ssdt_user
Member

Откуда:
Сообщений: 9
Владислав Колосов
абсолютно непонятно - откуда у Вас дублирование...

Например, Есть 2 сущности у которых одинаковые критичные параметри но идентификаторы разные. У меня айдишки для сущностей при вставке генерируются хранимыми процедурами отделной БД ответсвтенной за генерацию уникальних идентификаторов в системе. Так как ключ секцирования GUID, я не могу предугадать на какой именно сервер попадет запись. При этом целосность даных будет нарушена.

invm Спасибо, буду читать как правильно пользоваться sp_getapplock. Возможно у вас есть какие нибуть замечания по поводу использования даной штуковины в триггерах?
28 ноя 16, 14:22    [19942885]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
Ошибка где-то тут:

автор
ключ секцирования GUID я не могу предугадать на какой именно сервер попадет запись. При этом целосность даных будет нарушена


ошибка логическая, ее sp_getapplock не исправит, как мне кажется.
28 ноя 16, 14:36    [19942982]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
ssdt_user
Возможно у вас есть какие нибуть замечания по поводу использования даной штуковины в триггерах?
В триггерах, любые "штуковины" снижающие уровень конкурентного выполнения запросов и увеличивающие длительность транзакций, нужно использовать с осторожностью и пониманием возможных последствий. sp_getapplock одна из таких "штуковин".
28 ноя 16, 14:39    [19943006]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ssdt_user
Так как ключ секцирования GUID
серьёзно?
28 ноя 16, 14:42    [19943022]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
ssdt_user
Member

Откуда:
Сообщений: 9
Верблюд,
Обоснуйте пожалуста. Вы считаете, идеальным был бы ключ состоящий именно из этих критических полей?
28 ноя 16, 14:44    [19943037]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
ssdt_user
Member

Откуда:
Сообщений: 9
TaPaK,
Да вполне.
28 ноя 16, 14:45    [19943047]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ssdt_user,

ради интереса как генерируете и как секционируете
28 ноя 16, 14:52    [19943071]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Какой смысл секционировать по GUID? Вам разве по GUID надо произвести разбиение данных по базам? GUID и так уникален, если что.
28 ноя 16, 14:58    [19943109]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
o-o
Guest
Владислав Колосов
Какой смысл секционировать по GUID? Вам разве по GUID надо произвести разбиение данных по базам? GUID и так уникален, если что.

у него не гуид повторяется, а ряд критичных полей.
и распределяет он не по базам, а по серверам
28 ноя 16, 15:05    [19943150]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
o-o,

Если по серверам, то о секционированном представлении вообще нет речи, т.к. оно через линки не работает. Соответственно, надо не не по guid данные разбрасывать, с таким же успехом можно использовать генератор случайных чисел.
28 ноя 16, 15:09    [19943179]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
o-o
Владислав Колосов
Какой смысл секционировать по GUID? Вам разве по GUID надо произвести разбиение данных по базам? GUID и так уникален, если что.

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


по базам на серверах

а с чего бы критичные поля не повторяются, если их случайным образом по базам раскидывают?
28 ноя 16, 15:10    [19943182]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
ssdt_user
Member

Откуда:
Сообщений: 9
TaPaK,
+
CREATE PROCEDURE [dbo].[SP_DictTable467IdGet]
@numberOfRows INT = 1
AS
SET NOCOUNT, XACT_ABORT ON

DECLARE @t TABLE(Id_Table467 INT NOT NULL, Table467Kode UNIQUEIDENTIFIER)

IF @numberOfRows <= 1
BEGIN
INSERT [dbo].[T_Table467Sequence]
OUTPUT inserted.[Id_Table467], inserted.[Table467Kode] INTO @t([Id_Table467], [Table467Kode])
DEFAULT VALUES
END
ELSE
BEGIN
IF @numberOfRows <= [dbo].[idnt_MaxNumberOfRows]()
MERGE [dbo].[T_Table467Sequence]
USING
(
SELECT TOP(@numberOfRows) v.number
FROM [master].[dbo].[spt_values] v
) AS ts ON 1 = 0

WHEN NOT MATCHED THEN
INSERT DEFAULT VALUES
OUTPUT inserted.[Id_Table467], inserted.[Table467Kode] INTO @t([Id_Table467], [Table467Kode]);
ELSE
MERGE [dbo].[T_Table467Sequence]
USING
(
SELECT TOP(@numberOfRows) m.number
FROM [master].[dbo].[spt_values] AS m
CROSS JOIN [master].[dbo].[spt_values] AS j
) AS ts ON 1 = 0

WHEN NOT MATCHED THEN
INSERT DEFAULT VALUES
OUTPUT inserted.[Id_Table467], inserted.[Table467Kode] INTO @t([Id_Table467], [Table467Kode]);
END

DELETE [dbo].[T_Table467Sequence] WITH(READPAST)

SELECT
Id_Table467 AS [Id_Table467]
, Table467Kode AS [Table467Kode]
, ROW_NUMBER() OVER (ORDER BY Id_Table467) AS [Id_Index]
FROM @t
OPTION(MAXDOP 1)

RETURN 0

Секцирую через CHECK. Здесь все стандартно
+

CONSTRAINT [T_Table467_CK1] CHECK(	Table467Kode >= N'00000000-0000-0000-0000-000000000000' AND 
Table467Kode < '...')

28 ноя 16, 15:11    [19943195]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ssdt_user,

дурдом...
28 ноя 16, 15:28    [19943280]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
ssdt_user
Member

Откуда:
Сообщений: 9
TaPaK,
Почему?..
28 ноя 16, 15:40    [19943337]     Ответить | Цитировать Сообщить модератору
 Re: Распределенная БД и дубликаты  [new]
ssdt_user
Member

Откуда:
Сообщений: 9
Я вот вчера подумал, возможно полезнее буде сделать следующее: в отдельной БД создать таблицу которая будет выступать в роли кросс-серверного транзакционного мутекса. Написать хранимки которые при помощи sp_getapplock будут создавать/удалять записи в этой таблице.
А уже в хранимке на вставку использовать этот код:
[IdentityServ].[IdentityDB]..[SP_AcquireResourceLock]
,
[IdentityServ].[IdentityDB]..[SP_ReleaseResourceLock] 

Как думаете?
29 ноя 16, 10:20    [19945928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить