powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Предотвратить добавление дублей когда выполняются несколько сессий.
5 сообщений из 5, страница 1 из 1
Предотвратить добавление дублей когда выполняются несколько сессий.
    #40002896
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,
что-то затруднился как лучше сделать. Есть запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @id INT

SELECT Id FROM test2 
WHERE Name = 'Name1'

IF (@id = null)
  INSERT INTO test2
  (Name, Sum)
  VALUES('Name1', 0)



Когда две сессии начинают выполнять этот код одновременно, одновременно выполняют select и убеждаются что записи с Name = 'Name1' в таблице нет и обе начинают выполнять insert. Но мне не нужны дублирующиеся записи, как лучше сделать чтобы дубли не добавились?
...
Рейтинг: 0 / 0
Предотвратить добавление дублей когда выполняются несколько сессий.
    #40002922
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
merge into test2 with (serializable) t
using
 (values ('Name1', 0)) s(Name, Sum) on s.Name = t.Name
when not matched then
 insert
  (Name, Sum)
 values
  (s.Name, s.Sum);



Плюс добавить ограничение уникальности по Name.

Если только добавить без дальнейших манипуляций, то просто ограничение уникальности по Name с IGNORE_DUP_KEY = ON
...
Рейтинг: 0 / 0
Предотвратить добавление дублей когда выполняются несколько сессий.
    #40002937
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigor mortis
Привет,
что-то затруднился как лучше сделать. Есть запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @id INT

SELECT Id FROM test2 
WHERE Name = 'Name1'

IF (@id = null)
  INSERT INTO test2
  (Name, Sum)
  VALUES('Name1', 0)



Когда две сессии начинают выполнять этот код одновременно, одновременно выполняют select и убеждаются что записи с Name = 'Name1' в таблице нет и обе начинают выполнять insert. Но мне не нужны дублирующиеся записи, как лучше сделать чтобы дубли не добавились?

У меня вопросы к показанному нам SQL.
Какой результат сравнения @id = null ? А вы-то полагаете, что "записи с Name = 'Name1' в таблице нет"!
В каком месте @id инициализируется?

C такими ошибками у вас должно быть много проблем и в других местах.
...
Рейтинг: 0 / 0
Предотвратить добавление дублей когда выполняются несколько сессий.
    #40002950
rigor mortis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

да, криво написал. здесь должно быть так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE @id INT

SELECT Id into @id FROM test2 
WHERE Name = 'Name1'

IF (@id = null)
  INSERT INTO test2
  output inserted.Id into @id
  (Name, Sum)
  VALUES('Name1', 0)

select @id//внешний код должен получить id



Тоже хотел merge, но думал может пооптимальнее есть решение
...
Рейтинг: 0 / 0
Предотвратить добавление дублей когда выполняются несколько сессий.
    #40002966
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rigor mortis,

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

Исходя только из условий что вы описали, я бы сделал так:

Объявил таблицу с уникальной колонкой Name.(ключ)
Вместо проверки, вставлял бы запись - sql сам проверит на уникальность и не вставит дупликат.

Обрабатывал бы ошибку, если интересно что произошло.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Предотвратить добавление дублей когда выполняются несколько сессий.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]