Java Spring嵌套@Transactional方法在父@Transactional方法执行之前将记录存储到db
我有春天4号和冬眠4号。我的问题是,我想对导入的数据进行事务处理。我解析JSON,然后将其存储到DB。但当出现问题时(服务器将停机)。我不希望数据库中有部分数据 我有一个方法:Java Spring嵌套@Transactional方法在父@Transactional方法执行之前将记录存储到db,java,spring,hibernate,transactional,Java,Spring,Hibernate,Transactional,我有春天4号和冬眠4号。我的问题是,我想对导入的数据进行事务处理。我解析JSON,然后将其存储到DB。但当出现问题时(服务器将停机)。我不希望数据库中有部分数据 我有一个方法: @Transactional private void processJson() 在其中,我在循环中调用: recipientGroupSellInService.saveOrUpdate(perDay); 看起来很像这样: @Transactional private void processJson(){
@Transactional
private void processJson()
在其中,我在循环中调用:
recipientGroupSellInService.saveOrUpdate(perDay);
看起来很像这样:
@Transactional
private void processJson(){
for(int i : iSet){
recipientGroupSellInService.saveOrUpdate(perDay[i]);
}
}
保存或更新:
@Transactional
public Boolean saveOrUpdate(T model) {
getSession().saveOrUpdate(model);
return true;
}
因此,在调用saveOrUpdate
后,数据将存储到数据库中,并且不会在方法processJson
出现一般故障时回滚
在方法
processJson
上,我应该注意什么或改变什么以获得“真正的事务”?事务是在processJson()
中启动的。由于您的saveOrUpdate()
正在使用常规的@Transactional
,因此它将加入以前启动的事务
如果出现问题(即RuntimeException
),则由processJson()
生成的任何内容都将回滚
您是否声称正在看到写入部分数据的行为?您是否配置了PlatformTransactionManager?(来自xml或来自配置) 例如:
getSession()返回什么?getSession:protected Session getSession(){return sessionFactory.getCurrentSession();}
确保没有复制组件(在ContextLoaderListener
和DispatcherServlet
中扫描组件可能会导致重复的组件—由于该上下文中没有
,因此无法进行转换。我非常确定我没有重复的组件,它的所有注释都是由
驱动的是的,我开始进行导入,大约需要几分钟,一次启动后,我可以在DB(SQL SERVER)中看到数据,在我终止进程后,所有数据都保留在DBI中。我有@Autowired@Bean(name=“transactionManager”)公共HibernateTransactionManager getTransactionManager(SessionFactory SessionFactory){HibernateTransactionManager transactionManager=新的HibernateTransactionManager(sessionFactory);return transactionManager;}
在@EnableTransactionManagement公共类AppConfig中实现SchedulingConfigurer{
启动应用程序后,我得到如下日志:12:14:08263信息TransactionFactoryInitiator:62-hh000399:使用默认事务策略(直接JDBC事务)
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>