Вы можете иметь транзакции на обоих уровнях, если каждый вызванный слой знает о существующих транзакциях.
Так что, если вы ожидаете повторного использования хранимого процесса, вы можете сообщить об этом транзакции, запущенной изклиентский код, другой сохраненный процесс и не выполнять никаких операций start / commit / rollback.
Если он не обнаружил транзакцию, он может начать / commit / rollback самостоятельно.
Это поведениеэто важно, потому что SQL Server на самом деле не имеет вложенных или автономных транзакций: поэтому сделайте каждый сохраненный процесс безопасным, и вам не нужно об этом думать.
Шаблон в моем ответе здесь обнаружит транзакцию и сделает точноthis:
Вложенные хранимые процедуры, содержащие шаблон TRY CATCH ROLLBACK?