@Transactional
 private void executeTestNested(ConnectionInfo info) {
   helper.execute("INSERT INTO Foo VALUES('e', 'E')");
   assertData("e", "E");
   TestHelper.assertInTransaction(info);
   helper.execute("INSERT INTO Foo VALUES('f', 'F')");
   assertData("f", "F");
   TestHelper.assertInTransaction(info);
   executeNestedNonTransactionTest(info);
 }
 @Transactional
 void executeTest() {
   TestHelper.assertInTransaction();
   helper.execute("INSERT INTO Foo VALUES('c', 'C')");
   assertData("c", "C");
   ConnectionInfo info = TestHelper.getConnectionInfo();
   helper.execute("INSERT INTO Foo VALUES('d', 'D')");
   assertData("d", "D");
   TestHelper.assertInTransaction(info);
   executeTestNested(info);
 }
 @Transactional
 List<ConnectionInfo> executeExceptionalTest() {
   TestHelper.assertInTransaction();
   helper.execute("INSERT INTO Foo VALUES('i', 'I')");
   assertData("i", "I");
   throw new RuntimeException("test");
 }
 private void executeNestedNonTransactionTest(ConnectionInfo info) {
   helper.execute("INSERT INTO Foo VALUES('z', 'Z')");
   assertData("z", "Z");
   TestHelper.assertInTransaction(info);
 }