powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заблокировать таблицу от удаления до конца транзакции
17 сообщений из 67, страница 3 из 3
Заблокировать таблицу от удаления до конца транзакции
    #39625975
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
    INSERT tbEventCalculationList WITH (UPDLOCK, HOLDLOCK, INDEX = IX_tbEventCalculationList _EventId)
    (EventId, DataFormingDate) 
    SELECT EventId, DataFormingDate
    FROM #tbEventToGroup



это ошибка?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39625977
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneэто ошибка? чукча не читатель?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39625984
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и вообще

авторThe ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL Server. These hints do not affect the performance of INSERT statements. Avoid using them in new development work, and plan to modify applications that currently use them.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39625989
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKKonst_Oneэто ошибка? чукча не читатель?

я выделил пробел для ТС, если что. а вы читайте дальше
синтаксис неправильный (я только про это, дальше сами занимайтесь маразмом в рамках данной задачи)
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39625991
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneTaPaKпропущено...
чукча не читатель?

я выделил пробел для ТС, если что. а вы читайте дальше
синтаксис неправильный (я только про это, дальше сами занимайтесь маразмом в рамках данной задачи)
т.е. то что INDEX в хинет на insert вообще не опция(о чём и приведена ошибка), вас конечно не смущает
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626002
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKKonst_Oneпропущено...


я выделил пробел для ТС, если что. а вы читайте дальше
синтаксис неправильный (я только про это, дальше сами занимайтесь маразмом в рамках данной задачи)
т.е. то что INDEX в хинет на insert вообще не опция(о чём и приведена ошибка), вас конечно не смущает

так про это уже до меня сказали. или вы адвокат?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626005
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneэто ошибка?
Это опечатка, без пробела тоже не работает.

Да, необходимо уточнить, что если в 2х параллельных транзакциях записи в таблицах #tbEventToGroup не пересекаются по EventId, то они не должны блокировать друг друга.

Konst_Oneпо EventId уникальный индекс?
Нет, уникальный индекс только по tbEventCalculationList.Id
Вообще эта таблица в разработке, и я могу повесить на EventId кластерный индекс, если это поможет решить задачу.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626010
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,

Кластерный индекс не делает поле уникальным. Если нет уникальности значения, то надо что бы все сесии знали что же за значения вы вставляете. А вообще бред какой-то, если первая сессия вставляет EventId1 и EventId2, вторая сессия встав EventId3, EventId1 втроую выбрасываем и теряем EventId3?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626018
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK если первая сессия вставляет EventId1 и EventId2, вторая сессия встав EventId3, EventId1 втроую выбрасываем и теряем EventId3?
Почему выбрасываем?
вторая сессия просто ждет, пока закончится первая.
В то же самое время 3ья сессия с EventId4, EventId5 должна спокойно параллельно выполняться.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626021
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,

авторвторая сессия просто ждет, пока закончится первая.зачем? в чём перформанс то?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626026
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя честно говоря, со второй сессией все так просто.
В #tbEventToGroup не зря есть поле DataFormingDate.
Если на момент получения блокировки окажется,
что в tbEventCalculationList самая последняя запись с EventId1 имеет DataFormingDate >= #tbEventToGroup.DataFormingDate, то строка с EventId1 будет удалена из #tbEventToGroup и данные по EventId1 во второй сессии сохраняться не будут.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626028
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKШамиль Фаридович,

авторвторая сессия просто ждет, пока закончится первая.зачем? в чём перформанс то?
Тут дело не производительности, а в целостности данных.
Если разрешить конкурентам параллельно сохранять данные по одним и тем же EventId, то они моментально ее порушат.
А еще могут потереть свежие данные старыми.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626033
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль ФаридовичTaPaKШамиль Фаридович,

пропущено...
зачем? в чём перформанс то?
Тут дело не производительности, а в целостности данных.
Если разрешить конкурентам параллельно сохранять данные по одним и тем же EventId, то они моментально ее порушат.
А еще могут потереть свежие данные старыми.
у вас какая-то странная/не правильная/отвратительная архитектура. Запретите параллельную вставку и не мучайте народ реализацией костыля
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626050
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,
стадия 1. Отрицание (или запрет).

Даже не буду обсуждать требования заказчика.

Лучше вернемся к сабжу, расширю постановку.
Есть некая процедура по расчету стоимостей/группировке ивентов (примерный макет в первом сообщении - важно отметить, что в ней есть 2 больших блока - расчет данных во временных таблицах и их сохранение, обернутое в транзакцию).
Ивент туда может передаться как 1, так и пол таблицы tbEvent (в ней сейчас 6M записей).
Естественно, что те вызовы, в которые передали меньшее количество ивентов будут отрабатывать быстрее.
Более того, маленькие вызовы чаще всего обладают более актуальными данными, и большой вызов, когда наконец допрется до начала транзакции, не должен перетирать пересчитанные за время его выполнения ивенты своими потерявшими актуальность данными.

Для этого я хочу сделать таблицу tbEventCalculationList, в которую каждая транзакция будет класть список пересчитанных ей ивентов.
И в начале транзакции пытаться вставить в эту таблицу ивенты из #tbEventToGroup за исключением тех, что потеряли актуальность и защитить этот диапазон от конкурентов. Пока я не придумал, как это реализовать.

Есть альтернативный вариант Б: таблица tbEventCalculationState, куда скопируются все строки из tbEvent(и будут далее синхронизироваться), а каждая процедура по расчету будет просто менять DataFormingDate у соответствующих ивентов.
Здесь вроде все просто, вешаешь holdlock и никто твои ивенты до конца транзакции не пересчитает.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626063
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль ФаридовичБолее того, маленькие вызовы чаще всего обладают более актуальными данными, и большой вызов, когда наконец допрется до начала транзакции, не должен перетирать пересчитанные за время его выполнения ивенты своими потерявшими актуальность данными.Читайте про уровень изоляции SNAPSHOT и как там реализована защита от подобных случаев.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626065
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,

А почему последовательно не хотите обрабатывать? Отправляйте все запросы в сервис брокер и выбирайте из очереди по одному. Если уж транзакции не устраивают.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39626077
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,

Или добавьте в таблицу столбец типа rowversion. Вычитывайте его значения в начале обработки и проверяйте в момент обновления.
...
Рейтинг: 0 / 0
17 сообщений из 67, страница 3 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заблокировать таблицу от удаления до конца транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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