我正在使用Spring的@Transactional
注解为我的DAO类/方法进行DB操作。Hibernate
ORM配置了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)查询。
如果删除了@Transactional
Exception
,则会抛出session sionFactory
未同步。
如果只读=true
添加性能会降低。@Transactional(value="myTransactionManager",只读=true)
有什么方法可以阻止Session
打开事务
??
在您的情况下,良好的做法是用SUPPORTS
的传播级别标记交易:
支持当前事务,如果不存在,则以非事务方式执行。
因此,如果父方法不在事务上下文中,则此方法也不会,但可以。
@Transactional(propagation=Propagation.SUPPORTS, value = "myTransactionManager")