2016-12-20 7 views
-1

В настоящее время я работаю над приложением весеннего mvc + hibernate. Он имеет уровень обслуживания и DAO.Зависимый откат между различными реализациями DAO

Я хочу знать, есть ли способ достичь зависимый откат между различными реализациями DAO.

Например, я добавляю запись/строку в таблицу A, сопоставленную с моделью A, с использованием реализации DAO A. , тогда я пытаюсь сделать то же самое для таблицы B. Однако при попытке сделать то же самое для таблицы C возникает ошибка , то я хочу, чтобы откатить оба изменения, сделанные в таблице а и В. Таблица

есть ли способ для достижения этой цели, дай мне знать любую помощь ценится и спасибо заранее: D

Примечания к Модераторы: Я знаю, что этот вопрос может показаться упрямым, но будьте уверены, если я не найду удовлетворительного ответа через несколько дней, я закрою это я сам.

+1

Да, вся суть сделок. Пока все взаимодействия DAO выполняются в одной транзакции, все откатывается. –

+0

Это понятно, но я хочу добиться того, чтобы между различными DAO была зависимая цепочка транзакций. Если у одного из них есть ошибка, то все предыдущие транзакции [которые могут быть уже совершены] также откат. эти транзакции не будут находиться в одном аннотированном файле @transaction. – abhi314

+0

совершено. Вы не можете отменить то, что уже сделано. Если вы хотите отменить изменение, не делайте этого. –

ответ

2

Очевидно, что вы вызовете все эти методы dao из своего класса обслуживания. Сделайте этот метод обслуживания/класс транзакционным. Аннотировать метод/класс службы с помощью @Transactional.

  1. Это приведет к созданию нового сеанса Hibernate в начале выполнения метода.
  2. Будет использовать этот сеанс для всех ваших транзакций db на уровне dao.
  3. Выполняет/отменяет все эти транзакции db в конце.

Если есть какое-либо исключение Runtime, во время изменения таблицы C откат будет выполняться автоматически в таблицах A & B.

См эти

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html http://blog.jhades.org/how-does-spring-transactional-really-work/

1

Да, вы можете откатить все транзакции, пожалуйста, найти ниже фрагмент кода, от serviceMethod вы вызываете все DTO методов, в случае исключения всех транзакций будут откатить.

Примечание: вы должны указать, для какого исключения вы хотите откат. для транзакции исключения времени выполнения не будет отката. Spring DTO бросает DataAccessException, которое является исключением во время выполнения и использует правильную реализацию transactionManager.

@Service 
    public class ServiceClass{ 

     @Autowire 
     private Repository repo; 

     @Transactional(rollbackFor={XYZ.class}, propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE) 
     public void serviceMethod(){ 
      repo.insertIntoA(); 
      repo.insertIntoB(); 
      repo.insertIntoC(); 
     } 
    } 

конфигурации XML:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"></property> 
</bean> 

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <!-- Thread safe, singletone , Hibernate 3 only --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="mappingResources"> 
      <array> 
       <value>com/domain/Customer-hbm.xml</value> 
      </array> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
        <prop key="hibernate.show_Sql">true</prop> 
        <prop key="hibernate.format_sql">true</prop>   
      </props> 
     </property> 
    </bean>