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