Size: a a a

2020 September 25

g

greeninsania in sql_ninja
Я так понял, два потока пытаются одновременно вставить одно и тоже значение, для которого в таблице висит unique.
Один поток отрабатывает, второй отваливается с ошибкой про нарушение unique, так как первый успел вставить это значение.
Exists не помогает, потому что на момент проверки, оба потока видели, что такого значения в целевой таблице нет, и начали вставку.
Сталкивался, не решал проблему)
источник

А

Артем in sql_ninja
greeninsania
Я так понял, два потока пытаются одновременно вставить одно и тоже значение, для которого в таблице висит unique.
Один поток отрабатывает, второй отваливается с ошибкой про нарушение unique, так как первый успел вставить это значение.
Exists не помогает, потому что на момент проверки, оба потока видели, что такого значения в целевой таблице нет, и начали вставку.
Сталкивался, не решал проблему)
И табла последняя, мерджом не решить, хранит ссылки на другие таблы куда инсерт
источник

AS

Anastasiya Shmatkova in sql_ninja
Артем
И табла последняя, мерджом не решить, хранит ссылки на другие таблы куда инсерт
можно в сторону хинтов tablock(x)/updlock посмотреть в сочетании с явными транзакциями. Не соображу что-то с ходу, какой именно хинт вам лучше подойдет.  https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15
источник

2_

2flower _ in sql_ninja
greeninsania
Я так понял, два потока пытаются одновременно вставить одно и тоже значение, для которого в таблице висит unique.
Один поток отрабатывает, второй отваливается с ошибкой про нарушение unique, так как первый успел вставить это значение.
Exists не помогает, потому что на момент проверки, оба потока видели, что такого значения в целевой таблице нет, и начали вставку.
Сталкивался, не решал проблему)
а как по вашему вообще на пальцах может быть вставка одинаковых значений в уникальный столбец без ошибок?
источник

2_

2flower _ in sql_ninja
зачем exists как он поможет в этой случае?
источник

T

Timus in sql_ninja
может там просто надо обернуть в тарнзакцию и сделать merge?
источник

g

greeninsania in sql_ninja
2flower _
а как по вашему вообще на пальцах может быть вставка одинаковых значений в уникальный столбец без ошибок?
Так этого и не должно быть.
Exists - проверка при вставке insert .. where not exists..
Если одномоментно запустить два экземпляра вставки одних и тех же значений, то для обоих экземпляров not exists отработает и будет попытка вставки, которая приведёт для одного экземпляра к нарушению uq.
Думаю, тут с уровнем изоляций нужно поработать.
источник

T

Timus in sql_ninja
greeninsania
Так этого и не должно быть.
Exists - проверка при вставке insert .. where not exists..
Если одномоментно запустить два экземпляра вставки одних и тех же значений, то для обоих экземпляров not exists отработает и будет попытка вставки, которая приведёт для одного экземпляра к нарушению uq.
Думаю, тут с уровнем изоляций нужно поработать.
я думаю надо бы код увидеть. хоть примерный.
источник

2_

2flower _ in sql_ninja
greeninsania
Так этого и не должно быть.
Exists - проверка при вставке insert .. where not exists..
Если одномоментно запустить два экземпляра вставки одних и тех же значений, то для обоих экземпляров not exists отработает и будет попытка вставки, которая приведёт для одного экземпляра к нарушению uq.
Думаю, тут с уровнем изоляций нужно поработать.
нет, если уровень изоляции будет соответствующий
источник

А

Артем in sql_ninja
Условный код:
EXEC:
@outer_table

INSERT  @d
FROM @outer_table
WHERE  NOT EXISTS unique_table

BEGIN TRANS
INSERT INTO aggregat
SELECT *
FROM @d
RETURN agg_id

INSERT INTO aggregat2
SELECT *
FROM @d
RETURN agg2_id

INSERT INTO unique_table
SELECT *, agg_id, agg2_id
FROM @d
COMMIT TRANS
источник

А

Артем in sql_ninja
Уровень изоляции повышать нельзя 👌
источник

А

Артем in sql_ninja
Всей процы
источник

2_

2flower _ in sql_ninja
Артем
Уровень изоляции повышать нельзя 👌
почему?
источник

А

Артем in sql_ninja
Там добор данных идёт с очень важных систем
источник

А

Артем in sql_ninja
На первом шаге инсерта в @d
источник

2_

2flower _ in sql_ninja
Артем
Там добор данных идёт с очень важных систем
Это что такое и как связано с моим вопросом
источник

А

Артем in sql_ninja
2flower _
Это что такое и как связано с моим вопросом
Короче, там часть базы перечислена во фроме, которую локать нельзя при доборе данных.
источник

2_

2flower _ in sql_ninja
что мешает забрать данные в temp и сделать свое черное дело как положено?
источник

А

Артем in sql_ninja
2flower _
что мешает забрать данные в temp и сделать свое черное дело как положено?
так и делается. @d = temp.
источник

2_

2flower _ in sql_ninja
так что нельзя блокировать?
источник