== 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.
