这很奇怪,但我可能会遗漏一些东西
我正在使用quartz来初始化spring config xml。当我第一次触发石英作业时,事件会在发生异常时回滚。但是,当再次触发相同的作业时,事务不会因相同的异常而回滚。
我可以从日志中看到,当第一次触发作业时,数据源(来自Websphere数据源的Sybase Jconnect 7的jndi查找)被初始化(而不是第二次)。
服务层
@Transactional(value="transactionManager", propagation=Propagation.REQUIRES_NEW, rollbackFor=Exception.class)
public void saveInfo(
List<Foo> saveData) throws Exception {
try{
myDAO.saveInfo(saveData); //data to rollback on exception. Works First time only :(
}
catch(Exception ex){
logBO.createActivityLog("Error Saving Data");
throw ex;
}
}
弹簧-config.xml中
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
我已经玩过所有传播设置REQUIRED / REQUIRES_NEW /没有传播。
DAO方法执行批量更新(jdbcTemplate)
修改
第一次记录此行
J2CA0086W:可共享连接MCWrapper id 4c384c38已管理 连接WSRdbManagedConnectionImpl @ 6f5a6f5a 状态:使用来自资源mydatasource的STATE_TRAN_WRAPPER_INUSE 在本地交易遏制边界内。
答案 0 :(得分:0)
试试这个:
@TransactionConfiguration(transactionManager = "txManager",defaultRollback = true)
@Transactional
hibernate和数据源代码:
<!-- Hibernate Related Configuration. -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://192.168.1.9:5432/dbname"/>
<property name="username" value="postgres"/>
<property name="password" value="pwd"/>
<property name="validationQuery" value="SELECT 1"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.domain"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
和txManager:
<!-- Transaction Manager -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
不要忘记添加一行:
<property name="packagesToScan" value="com.domain"/>
<\ n>在sessionfactory中,由于这种情况发生了很多次。