title: Best practices for rolling back transactions in Spring 3/Hibernate
body: <p>Referencing <a href="http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#transaction-declarative">Spring documentation</a>:</p>
  
  <blockquote>
    <p>Any RuntimeException will trigger rollback, and any checked Exception will not</p>
  </blockquote>
  
  <p>Referencing <a href="http://www.javapractices.com/topic/TopicAction.do?Id=129">javapractices.com</a></p>
  
  <blockquote>
    <p>Unchecked exceptions :</p>
    
    <ul>
    <li>represent defects in the program (bugs) - often invalid arguments
    passed to a non-private method. To
    quote from The Java Programming
    Language, by Gosling, Arnold, and
    Holmes : "Unchecked runtime exceptions
    represent conditions that, generally
    speaking, reflect errors in your
    program's logic and cannot be
    reasonably recovered from at run
    time."</li>
    <li>are subclasses of RuntimeException, and are usually implemented
    using IllegalArgumentException, NullPointerException,
    or IllegalStateException</li>
    <li>a method is not obliged to establish a policy for the unchecked exceptions
    thrown by its implementation (and they almost always do not do so)</li>
    </ul>
    
    <p>Checked exceptions :</p>
    
    <ul>
    <li>represent invalid conditions in areas outside the immediate control of
    the program (invalid user input,
    database problems, network outages,
    absent files)</li>
    <li>are subclasses of Exception</li>
    <li>a method is obliged to establish a policy for all checked exceptions
    thrown by its implementation (either
    pass the checked exception further up
    the stack, or handle it somehow)</li>
    </ul>
  </blockquote>
  
  <p>If during my business logic I discover a problem and I want to rollback the changes, I have to throw a new RuntimeException?  It's not really a RuntimeException (unchecked exception) since I've identified it in the logic.  Or perhaps I'm misunderstanding these concepts?</p>
  
  <p><strong>My real question</strong>, what's best practices for rolling back a transaction in my @Transactional service methods?</p>