== isolation and readOnly == @Transactional(readOnly = true) active=True readOnly=True isolation=default (from the connection) @Transactional(isolation = SERIALIZABLE) [outer] active=True readOnly=False isolation=SERIALIZABLE REQUIRED inner joining it active=True readOnly=False isolation=SERIALIZABLE plain @Transactional [outer] active=True readOnly=False isolation=default (from the connection) inner declaring READ_UNCOMMITTED active=True readOnly=False isolation=default (from the connection) The last pair is the point. The inner method declares @Transactional(isolation = READ_UNCOMMITTED) and gets ISOLATION_DEFAULT, because it joined an existing physical transaction whose isolation was fixed when it began. The declaration is not rejected and nothing is logged -- it is simply ignored. Set validateExistingTransaction=true on the transaction manager and this becomes an exception instead of a silent no-op. It is off by default. The same applies to readOnly and timeout on a participating scope. == the transaction manager's own log lines == o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [com.ankurm.tx.service.SilentlyNonTransactional.properlyCalled]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.deleteAll]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [com.ankurm.tx.service.SilentlyNonTransactional.checkedExceptionCommits]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT o.s.orm.jpa.JpaTransactionManager: Participating in existing transaction o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.existsById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.existsById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [com.ankurm.tx.service.SilentlyNonTransactional.swallowsException]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT o.s.orm.jpa.JpaTransactionManager: Participating in existing transaction o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.existsById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.existsById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly o.s.orm.jpa.JpaTransactionManager: Creating new transaction with name [com.ankurm.tx.service.OuterService.readOnlyScope]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly o.s.orm.jpa.JpaTransactionManager: Participating in existing transaction Note ISOLATION_SERIALIZABLE appears on the 'Creating new transaction' line and never on a 'Participating' one: participation carries no settings of its own.