我目前正在开发一个spring mvc + hibernate应用程序。它有Service和DAO层。
我想知道的是有一种方法可以在不同的DAO实现之间实现依赖回滚。
例如,我通过使用A的DAO实现在表A中添加了与模型A映射的条目/行。 然后我试图为表B做同样的事情。但是当尝试相同的表C时,会发生错误 然后我希望回滚表A和表B中所做的更改。
有没有办法实现这一点,请告诉我任何帮助,并提前感谢您:D
主持人的说明:我知道这个问题可能听起来很自以为是,但如果我在几天内没有找到任何令人满意的答案,我会自行关闭。
答案 0 :(得分:2)
显然,您将从服务类中调用所有这些dao方法。使该服务方法/类事务性。使用@Transactional
注释服务方法/类。
如果发生任何运行时异常,则在表C修改期间,将在表A和表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 :(得分:1)
是的,你可以回滚所有的交易,请在下面的代码片段中找到你正在调用所有dto方法的serviceMethod,如果异常,所有交易都将回滚。
注意:您必须指定要回滚的异常。对于运行时异常事务将不会回滚。 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>