Many developers mistakenly believe that any error inside a transaction will make the transaction fail and automatically rollback. However, this is true only for fatal errors, such as most errors with severity equal to 16 or higher. The commonest runtime error – for example duplicate primary keys, violation of unique constraints and foreign key relationship – aren’t fatal and therefore won’t rollback the transaction.
To rollback a transaction when an error occurs you must manually check each statement for runtime error using the @@ERROR global variable, as in the following code snippet:
BEGIN TRANSACTIONINSERT authors VALUES (