Spring事务没有回滚异常(Oracle JNDI数据源)

top*_*r-j 5 oracle jndi spring-mvc

我在Spring MVC 3.1项目中使用基于注释的事务,并且在抛出异常时我的事务没有被回滚.

这是我的服务代码


@Service
public class ImportService {

    @Autowired
    ImportMapper importMapper;

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class)
    public void processImport() throws ServiceException, DatabaseException {
        iImport import = new Import();

        createImport(import);

        throw new ServiceException("");         
    }

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class)
    private void createImport(Import import) throws DatabaseException {
        try {
            importMapper.createImport(eventImport);
        } catch (Exception e) {
            throw new DatabaseException(e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,希望在抛出异常后回滚createImport方法.但不幸的是,事实并非如此.

我在服务器context.xml中定义我的数据源

<Resource name="datasource.import" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           username="user" password="password" driverClassName="oracle.jdbc.driver.OracleDriver"
           url="jdbc:oracle:thin:@INFO" />
Run Code Online (Sandbox Code Playgroud)

我正在寻找JNDI:

<jee:jndi-lookup id="dataSource" jndi-name="datasource.import"/>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven />
Run Code Online (Sandbox Code Playgroud)

我正在使用Oracle数据库,并且JDBC规范表明默认情况下自动提交是真的.我认为,如果我明确地将其设置为false会有所帮助,但我无法弄清楚如何做到这一点.

有没有办法让回滚工作,同时通过JNDI查找Oracle数据源.

Pav*_*ral 5

请注意,RuntimeException默认情况下,Spring的事务管理仅针对未经检查的例外()回滚事务.如果您还希望对已检查的异常执行回滚,则需要对其进行定义.

使用注释作为属性源时,需要为rollbackFor属性提供异常类列表,这应该导致事务回滚(引自JavaDoc):

/**
 * Defines zero (0) or more exception {@link Class classes}, which must be a
 * subclass of {@link Throwable}, indicating which exception types must cause
 * a transaction rollback.
 * <p>This is the preferred way to construct a rollback rule, matching the
 * exception class and subclasses.
 * <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class clazz)}
 */
Class<? extends Throwable>[] rollbackFor() default {};
Run Code Online (Sandbox Code Playgroud)