Do I need to call dispose in the finally block for SqlTransaction? Pretend the developer didnt use USING anywhere, and just try/catch.
SqlTransaction sqlTrans = con.BeginTransaction();
try
{
//Do Work
sqlTrans.Commit()
}
catch (Exception ex)
{
sqlTrans.Rollback();
}
finally
{
sqlTrans.Dispose();
con.Dispose();
}
I think you can just close connection. I checked the code of BCL -- seems like connections takes care of its transaction -- no need to close it explicitly.
In the general case, every
IDisposable
object you construct or obtain, and own, you have to dispose of.In the specific case, there are some exceptions, but
SqlTransaction
is not one of them.As per the the documentation of
SqlTransaction.Dispose
:(my emphasis)
Since the documentation does not state that those unmanaged resources are released when you issue a commit or a rollback, you will need to dispose of this object.
It does not hurt to have it. This is true for every class implementing IDisposable, otherwise it would not implement this interface.
But normally the garbage collector would deal with it if the object is not referenced anymore. Because i also don't want to call
dispose
on every second variable or use the using-statement everywhere, it it's always worth to look into the actual implementation of the class'Dispose
method.SqlTransaction.Dispose
:Without understanding all(or anything) what is happening here i can say that this is more than a simple
base.Dispose(disposing)
. So it might be a good idea to ensure that a SqlTransaction gets disposed.But because
SqlConnection.BeginTransaction
creates the transaction it could also be a good idea to reflect this also:As you can see. The GC will also keep the Connection alive when a Transaction is created. It also don't hold a reference to the transaction since it only returns it. Hence it might not be disposed even when the connection is already disposed. Another argument to dispose the transaction.
You might also have a look at the
TransactionScope
class which is more fail-safe thanBeginTransaction
. Have a look at this question for more informations.