First :
As suggested , first enable the log by adding the following in your log4j
log4j.category.org.springframework=ALL
Second :
if you are calling upload method from another method in the same Servcie class ( say xxxMethod) and the xxxMethod is not annotated by Transaction. then there wont be any rollback.
because calls between the method to method in proxy is not handled by Spring context. thus it wont be able to wrap the transaction.
if the Second is not valid, please enable the log verify the log. your logs should show when the transaction starts and when it ends and what are methods are added to the transaction context.
Like below
DEBUG org.springframework.transaction.annotation.AnnotationTransactionAttributeSource - Adding transactional method 'saveDomain' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2014-04-04 10:25:24,276 [main] TRACE org.springframework.orm.jpa.JpaTransactionManager - Triggering beforeCompletion synchronization
2014-04-04 10:25:24,276 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction rollback
And so
Note** , if you DAO Layer also annotated with Transaction and with propagation rule as Propagation.REQUIRES_NEW
- the Dao method considered as individual UoW . So throwing exception from service layer would not rollback the previous transaction.
In general - it would be advise to keep the transaction in one layer and preferably with Service - Layer