Обеспечение синхронизации потоков в SQL возможно? - PullRequest
0 голосов
/ 16 апреля 2009

Если у меня несколько SP

SP1
SP2
some_inline_queries

как мне убедиться, что все они запускаются одновременно, без прерывания от других потоков? Возможно ли это сделать на уровне SQL Server?

редактирование:

Допустим, у нас есть основной сценарий с 3 основными действиями:

sp1 сканирует таблицу t1, чтобы сгенерировать случайную строку, уникальную для столбца c1 в t1;

sp2 делает довольно интенсивные вещи;

некоторый оператор вставляет случайную строку, возвращаемую sp1, в c1 таблицы t1. Поэтому, если я запускаю много экземпляров этого основного сценария одновременно, мне нужно, чтобы все содержимое t1.c1 было разным, когда все сценарии закончили работать.

Ответы [ 2 ]

1 голос
/ 16 апреля 2009

Если я вас правильно понимаю, вы хотите установить уровень изоляции транзакции на SERIALIZABLE. Предполагая, что MSSQL обладает истинной сериализуемостью (это может и не быть; истинная сериализуемость редко требуется и часто довольно затратна для реализации), это гарантирует, что даже если вы выполните много транзакций одновременно, конечный результат будет идентичен выполнению одной (хотя который обычно является недетерминированным), ожидает его завершения, затем выполняет другую транзакцию и так далее. Тем не менее, будьте осторожны: в реализациях SERIALIZABLE базы данных часто встречаются тонкие «ошибки», будь то настоящие ошибки или ошибки, поскольку эти вещи действительно сложно исправить. Особенно неприятным является тот факт, что некоторые базы данных на основе MVCC (Oracle и PostgreSQL используют MVCC, и я знаю, что списки Postgres недавно обсуждали эти проблемы со своими СУБД) не совсем реализовали SERIALIZABLE, вместо этого использовав то, что следует называть изоляцией SNAPSHOT. - это дает 99% преимуществ SERIALIZABLE с минимальным ударом по производительности, но это бесполезно, если вы попадете в этот 1%.

Если SERIALIZABLE не является опцией, либо потому, что она не выполняет то, что вы хотите, либо по какой-то другой причине, вы всегда можете сделать так, чтобы каждый SP взял эксклюзивную блокировку перед выполнением своей грязной работы. Это может привести к тупикам или тайм-аутам и потребовать другой настройки в другом месте, так что это довольно уродливый вариант, но он должен выполнять свою работу.

1 голос
/ 16 апреля 2009

вы запускаете их внутри транзакции? Не уверен, что вы подразумеваете под «прерыванием», но они будут в безопасности, если предположить, что они находятся в пределах:

Begin Transaction MyTranNameHere
exec sp1
exec sp2
some statement
Commit Transaction MyTranNameHere
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...