提问者:小点点

Spring@Transactional防止打开事务


我正在使用Spring的@Transactional注解为我的DAO类/方法进行DB操作。HibernateORM配置了PostgreSQL

SessionFactory是在配置中使用@Bean创建的,并在DAO类中使用@Autowed检索。

@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)查询。

如果删除了@TransactionalException,则会抛出session sionFactory未同步。

如果只读=true添加性能会降低。@Transactional(value="myTransactionManager",只读=true)

有什么方法可以阻止Session打开事务??


共1个答案

匿名用户

在您的情况下,良好的做法是用SUPPORTS的传播级别标记交易:

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

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

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