我使用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
??
答案 0 :(得分:1)
在您的情况下,您可以使用SUPPORTS
的传播级别标记交易:
支持当前事务,如果没有,则以非事务性方式执行 存在。
因此,如果父方法不在事务上下文中,则此方法也不会,但可以。
@Transactional(propagation=Propagation.SUPPORTS, value = "myTransactionManager")