title: @Transactional (noRollbackFor=RuntimeException.class) does not prevent rollback on RuntimeException
body: <pre><code>@Transactional (noRollbackFor=RuntimeException.class)
  public void methodA (Entity e){
     service.methodB(e);
  }
  </code></pre>
  
  <p>---service method below---</p>
  
  <pre><code>@Transactional (propagation=Propagation.REQUIRES_NEW, noRollbackFor=RuntimeException.class)
  public void methodB (Entity e){
     dao.insert(e);
  }
  </code></pre>
  
  <p>When <code>dao.insert(e)</code> in <code>methodB()</code> causes a primary key violation and throws a <code>ConstraintViolationException</code>, which is a subclass of <code>RuntimeException</code>, I would expect the transaction to still commit because of the <code>noRollbackFor</code> property I used. But I observed that the outer transaction (on <code>methodA</code>) is still being rolled back by the <code>HibernateTransactionManager</code> with the message</p>
  
  <blockquote>
    <p>org.springframework.transaction.UnexpectedRollback Exception:
    Transaction rolled back because it has been marked as rollback-only</p>
  </blockquote>
  
  <p>I've found similar questions reported but not exactly this one.</p>