【问题标题】:Spring Transactions not rolling back on Exception (Oracle JNDI datasource)Spring Transactions 不回滚异常(Oracle JNDI 数据源)
【发布时间】:2013-06-13 22:25:16
【问题描述】:

我在 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 数据源时,有什么方法可以让回滚工作。

【问题讨论】:

  • 我解决了我的问题,但问题不是我最初想的那样。事务 bean 在错误的上下文文件中定义。我将它们放在根上下文中。这个问题帮助我解决了我的问题:stackoverflow.com/questions/10538345/…
  • 这个问题似乎跑题了,因为实际问题不是文中描述的问题。

标签: oracle spring-mvc jndi


【解决方案1】:

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

When using annotations as attribute source,您需要提供带有异常类列表的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 {};

【讨论】:

  • 已定义。 Transactional 注释有 rollbackFor=Throwable.class
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 2015-03-21
    • 2019-06-30
    • 1970-01-01
    • 2011-09-17
    • 2020-03-10
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多