No matter how you invoke it; for a composite operation it is entirely possible that the first operation will succeed and the second operation will fail (for example, a unique key violation or a foreign key violation). If you need to ensure all-or-nothing, then surround the call to Execute*
with a transaction, and only commit when you know it all worked.
You can also create transactions at the SQL level, but the tools at your disposal are easier to get wrong if you do it in TSQL. It does, to give due credit, avoid a few round-trips - but usually not so much that it is worth fighting the language to do it. Ultimately SQL is designed for good set-based DML operations - it isn't quite as good at more procedural code like execution flow management.