Spring @Transactional阻止了Transaction的开放

时间:2017-11-24 14:12:13

标签: java database postgresql hibernate spring-data

我使用Spring的@Transactional注释为我的DAO类/方法进行数据库操作。 Hibernate ORM配置了PostgreSQL

SessionFactory在配置中使用@Bean创建,并使用DAO类中的@Autowired进行后续处理。

@Autowired
SessionFactory sessionFactory;

@Transactional(value = "myTransactionManager")
public int getTotalClientsInDatabase() {
    Query countTotalClientsQuery = sessionFactory.getCurrentSession()
            .getNamedQuery(DeviceInfo.COUNT_TOTAL_CLIENTS);
    return Integer.parseInt(countTotalClientsQuery.uniqueResult().toString());
}

每当调用getTotalClientsInDatabase时,始终会打开一个事务。

我想阻止打开一个事务,因为它是一个SELECT(DDL)查询。

如果@Transactional被移除Exception,则表示sessionFactory未同步。

如果添加readOnly=true,则效果为dipped@Transactional(value = "myTransactionManager", readOnly=true)

有没有办法阻止Session打开Transaction ??

1 个答案:

答案 0 :(得分:1)

在您的情况下,您可以使用SUPPORTS的传播级别标记交易:

  

支持当前事务,如果没有,则以非事务性方式执行   存在。

因此,如果父方法不在事务上下文中,则此方法也不会,但可以。

@Transactional(propagation=Propagation.SUPPORTS, value = "myTransactionManager")