no sé como tengas toda tu estructura pero el code que tienes obviamente no es transaccional ya que la transacción la tienes a nivel función que está dentro de un ciclo, entonces es normal que si falla no se haga rollback de todo...
Lo que podrías hacer es por ejemplo en tu clase inicializar la conexion y la transaccion para que cuando pase por las iteraciones (foreach) ya tenga su transacción
Echale un ojo (solo para que te dés una idea de lo que hablo)
http://www.reflectionit.nl/DAL.aspx
SAlu2 y cualquier duda por aqui andamos..