Ответ 1
Будет только одно соединение, это то, что используется для запуска процедуры, независимо от количества команд SQL в хранимой процедуре.
так как у вас нет явной BEGIN TRANSACTION в хранимой процедуре, каждый оператор будет запускаться самостоятельно, без возможности отменить любые изменения, если есть какая-либо ошибка.
Однако, если вы до того, как вы вызовете хранимую процедуру, вы выдаете BEGIN TRANSACTION, то все операторы сгруппированы в транзакции и могут либо быть COMMITted, либо ROLLBACKed после выполнения хранимой процедуры.
Внутри хранимой процедуры вы можете определить, работаете ли вы в транзакции, проверив значение системной переменной @@TRANCOUNT (Transact-SQL). Нуль означает, что транзакции нет, что-то еще показывает, сколько вложенных уровней транзакций вы находитесь. В зависимости от вашей версии сервера sql вы можете использовать XACT_STATE (Transact-SQL ).
Если вы выполните следующее:
BEGIN TRANSACTION
EXEC my_stored_procedure_with_5_statements_inside @Parma1
COMMIT
все в рамках процедуры покрывается транзакцией, все 6 операторов (EXEC - это оператор, охватываемый транзакцией, 1 + 5 = 6). Если вы это сделаете:
BEGIN TRANSACTION
EXEC my_stored_procedure_with_5_statements_inside @Parma1
EXEC my_stored_procedure_with_5_statements_inside @Parma1
COMMIT
все в пределах двух вызовов процедуры покрывается транзакцией, все 12 операторов (2 EXECs - оба оператора, охватываемые транзакцией, 1 + 5 + 1 + 5 = 12).