当前位置: 首页 > 知识库问答 >
问题:

无法通过注释打开Spring事务

郤望
2023-03-14

在我的应用程序中,我有2个transactionManager,创建如下:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <qualifier value="exec"/>
    <property name="dataSource" ref="execDataSource"/>
</bean>
<bean id="txManagerAdmin" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <qualifier value="admin"/>
    <property name="dataSource" ref="adminDataSource"/>
</bean>

在同一个文件中,我有注释驱动的声明:

<tx:annotation-driven transaction-manager="admin"/>

为了简化admin transactionManager的可用性,我创建了一个简单的注释:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value="admin", rollbackFor=NullPointerException.class, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.DEFAULT)
public @interface AdminTx {

}

这是我的带有事务注释的方法:

@AdminTx
    @Override
    public UaCatalogDTO addUa(UaDTO uaDTO) throws TechnicalException {
        MapSqlParameterSource namedParameterSource = new MapSqlParameterSource();
        mapAllUaFields(uaDTO, namedParameterSource);
        try {
            jdbcTemplate.update(SqlQueries.ADD_UA, namedParameterSource);
        } catch (DuplicateKeyException e) {
            throw new TechnicalException(e, "ADM001");
        }
                if (1==1) //due to compiler
                throw new NullPointerException(); //to test the transaction is working
    }

由于有接口,该方法是从另一个类调用的。bean由Spring@Autowired注释注入。jdbcTemplate对象是用以下代码创建的:

@Autowired
@Qualifier("adminDataSource")
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}

我的问题是当我执行jdbcTemplate时。update()line,如果我检查数据库,数据已经存在。此外,即使我抛出NullPointerException,数据也会保留在数据库中。

经过一些搜索,我发现我们可以调用TransactionSynchronizationManager。isActualTransactionActive(),它返回我的值。所以我知道我的注释什么都不做,但我不明白为什么。

我在Webphere服务器上运行,数据库是DB2。

共有1个答案

王旺
2023-03-14

经过一番搜索,我终于找到了问题所在,所以如果有人感兴趣,我就发布它:它是Spring生成的bean,没有使用特定于XML的声明,而是Spring扫描。

当我试图在XML文件中声明我的bean,然后用自动连接和限定符将其注入类中时,事务最终打开并关闭。

顺便说一句,我不知道原因。

 类似资料:
  • 我想从AOP连接点检索一个注释。我能够通过反射获得注释,但无法通过ProcedingJoinPoint获得注释。 我的注释方法 我的绒球

  • 我正在尝试将Spring LDAP 池上下文源 XML 配置转换为使用注释。我能够通过遵循此处提到的一个来使 Ldap 上下文源正常工作,但我无法使池上下文源正常工作。当我运行代码时,我得到了空点异常。下面列出了 XML、注释和异常代码段。 XML配置片段, 注释配置片段, 我得到的例外,

  • 所以我是Spring的新人,目前对@Transactional Annoting感到困惑,我已经阅读了很多关于这个主题的问答,但似乎我仍然不明白。 这是我的问题: > < li> 执行插入更新删除时是否需要@Transactional批注?当我试图证明这一点时,我仍然可以执行插入和更新。你知道为什么会这样吗? 如果使用或不使用@Transactional注释,会有什么性能好处或问题吗?比如连接管理

  • 问题内容: 这是一个测试类: 这是我的输出: 我缺少通过反射使注释可见的什么? 我是否仅需要检查它们的存在就需要注释处理器? 问题答案: 为了在运行时访问注释,它需要具有运行时的保留策略。 否则,注释将被丢弃,并且JVM无法识别它们。 有关更多信息,请参见此处。

  • 试图收集和理解@事务性注释的要点并越过了一点。因此,在使用事务性注释时,我们需要记住的主要事情是: 事务注释只能应用于公共方法[根据Spring@Transactional属性对私有方法起作用吗? 事务性注释应该应用于具体的类,而不是接口[根据我应该将@transactional annotation放在接口定义还是实现类的位置? 事务注释应应用于服务级别[根据Spring@Transaction

  • 我想使用spring-data-elasticsearch-2.1.0创建如下所示的用户索引。注释。我找不到任何注释来添加“null_value”:“null”。这是必需的,因为我们的排序顺序正在失败。 域类 如何在innerfield中通过spring-data-elasticsearch注释添加“null_value”:“null”?我不想在外部创建索引映射。