2015-06-20 2 views
1

Я прочитал много страниц stackoverflow о весенней транзакции. Моя весна сделка конфигурации являетсяЯвляется ли весенняя транзакция только при вводе метода обслуживания?

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

Моя служба, как это.

@Service 
public class TestServiceImpl implements TestService { 
    @Override 
    public void testRollback() { 
      testRollbackSecondLevel(); 
    } 

    @Transactional 
    @Override 
    public void testRollbackSecondLevel() { 
     // any update sql in here 
     carCostService.testUpdate(); 

     throw new RuntimeException(); 
    } 
} 

я написать тестовый класс, чтобы проверить, в моем тестовом коде, когда я использую

// this test is not roll back, and the Transactional even not created 
@Test 
public void testTransactional() { 
    // use this function, the Transactional don't work 
    interCityService.testRollback(); 
} 

// this test is roll back successfully 
@Test 
public void testTransactionalSecondLevel() { 
    // but if I use the second level function instead of the first function, 
    // the Transactional works fine, and the data can roll back 
    interCityService.testRollbackSecondLevel(); 
} 

И я отлаживать код, когда я использую первый тест, транзакционный даже не может быть создан. Второй способ может успешно создать транзакцию.

Я использую sql, чтобы судить о том, что сделка существует.

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G 

Если sql возвращает пустой набор, поэтому транзакция не была создана.

Так в чем проблема? заранее спасибо.

Я использую весеннюю версию 4.1.2.RELEASE.

ответ

1

spring @Transactional работает с использованием прокси, это означает, что метод вызова с этой аннотацией из того же класса не имеет никакого влияния == @Transactional будет игнорироваться. Есть maaaaany темы об этом, пожалуйста, обратите внимание на более глубокое объяснение, например, здесь: Spring @Transaction method call by the method within the same class, does not work?

+0

Я все еще не понимаю, как изменить мой код на работу? Изменение в . Это не работает. – yunfan

0

Если вы хотите, чтобы все ваши услуги метод TRANSACTIONAL добавить транзакционной аннотацию как класс, а не метод уровня

@Transactional 
@Service 
public class TestServiceImpl implements TestService { 

    @Override 
    public void testRollback() { 
     testRollbackSecondLevel(); 
    } 


@Override 
public void testRollbackSecondLevel() { 
    // any update sql in here 
    carCostService.testUpdate(); 

    throw new RuntimeException(); 
} 
} 

Кроме того, поскольку они объясняют, что вы уже не можете начать транзакцию внутри одной и той же службы. Поэтому, если вы хотите сделать первый метод транзакционным, вы должны вызывать его из-за пределов вашей службы.

Смежные вопросы