不同 DAO 实现之间的依赖回滚
Dependent rollback among different DAO implementation
我目前正在开发 spring mvc + hibernate 应用程序。它有服务和 DAO 层。
我想知道的是有没有办法实现不同DAO实现之间的依赖回滚。
例如,我通过使用 A 的 DAO 实现在与模型 A 映射的 table A 中添加了一个条目/行。
然后我尝试对 Table B 做同样的事情。但是当尝试对 Table C 做同样的事情时,出现错误
然后我希望回滚在 Table A 和 Table B 中所做的更改。
有没有办法做到这一点,如果有任何帮助,请告诉我,在此先感谢您:D
版主注意事项:我知道这个问题听起来有点自以为是,但请放心,如果几天后我没有找到满意的答案,我会自己关闭它。
显然,您将从您的服务中调用所有这些 dao 方法 class。使该服务 method/class 交易。用 @Transactional
.
注释服务 method/class
- 这将在方法执行开始时创建一个新的 Hibernate 会话。
- 将为您在 dao 层中的所有数据库事务使用该会话。
- Commits/Rollback 所有这些数据库事务都在最后。
如果在您的 Table C 修改期间发生任何运行时异常,回滚将在 Tables 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/
是的,您可以回滚所有事务,请在下面的代码片段中找到,您正在从 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>
我目前正在开发 spring mvc + hibernate 应用程序。它有服务和 DAO 层。
我想知道的是有没有办法实现不同DAO实现之间的依赖回滚。
例如,我通过使用 A 的 DAO 实现在与模型 A 映射的 table A 中添加了一个条目/行。 然后我尝试对 Table B 做同样的事情。但是当尝试对 Table C 做同样的事情时,出现错误 然后我希望回滚在 Table A 和 Table B 中所做的更改。
有没有办法做到这一点,如果有任何帮助,请告诉我,在此先感谢您:D
版主注意事项:我知道这个问题听起来有点自以为是,但请放心,如果几天后我没有找到满意的答案,我会自己关闭它。
显然,您将从您的服务中调用所有这些 dao 方法 class。使该服务 method/class 交易。用 @Transactional
.
- 这将在方法执行开始时创建一个新的 Hibernate 会话。
- 将为您在 dao 层中的所有数据库事务使用该会话。
- Commits/Rollback 所有这些数据库事务都在最后。
如果在您的 Table C 修改期间发生任何运行时异常,回滚将在 Tables 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/
是的,您可以回滚所有事务,请在下面的代码片段中找到,您正在从 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>