Recently I performed some tests on transaction behavior in SSIS; these are my findings
We use a TSQL BEGIN/COMMIT TRAN within a SQL tasks to define the boundaries of a transaction within a package. All SQL tasks within these boundaries will succeed or fail as one unit of work if you define the RetainSameConnection option for the connection manager to TRUE
A data flow task that resides within a BEGIN/COMMIT TRAN flow, runs under a separate transaction. I.e. if a SQL Task after the data-flow task fails, the data generated by the data flow task will not be rolled back. This is kind of confusing.
Use TransactionOptions in SSIS package.