title: sql try/catch rollback/commit - preventing erroneous commit after rollback
body: <p>I am trying to write an MS sql script that has a transaction and a try/catch block.  If it catches an exception, the transaction is rolled back.  If not, the transaction is committed.  I have seen a few different websites saying to do it like this:</p>
  
  <pre><code>begin transaction
  begin try
      --main content of script here
  end try
  begin catch
      rollback transaction
  end catch
  
  commit transaction
  </code></pre>
  
  <p>But won't we still hit the "commit transaction" line even in the case of catching an exception?  Won't this lead to a SQL error because the transaction has already been rolled back?  I think it should be done like this:</p>
  
  <pre><code>declare @success bit = 1
  
  begin transaction
  begin try
      --main content of script here
  end try
  begin catch
      rollback transaction
      set @success = 0
  end catch
  
  if(@success = 1)
  begin
      commit transaction
  end
  </code></pre>
  
  <p>Howcome the commonly-posted solution does not include the @success variable?  Is there no sql error that happens as a result of committing a transaction that has already been rolled back?  Am I incorrect in saying that the "commit transaction" line of the first code example will still be hit in the case of catching an exception?</p>