5

我在 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);
        }
    }

因此,希望 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" />

我正在用 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 />

我使用的是 Oracle 数据库,JDBC 规范说默认情况下自动提交是真的。我认为如果我将其明确设置为 false 会有所帮助,但我不知道该怎么做。

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

4

2 回答 2

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 {};
于 2013-06-14T06:45:53.077 回答
0

据说,如果一个@transational 方法被另一个@transational 方法调用,第一个将不起作用。您可以尝试删除第一个 @transational 并尝试一下。

于 2015-06-25T02:00:10.330 回答