gpt4 book ai didi

java - 没有 @Transactional 注释的 Spring 托管事务

转载 作者:IT老高 更新时间:2023-10-28 13:53:04 25 4
gpt4 key购买 nike

我正在使用 Spring 注释来管理我的事务,如下所示:

@Transactional(readOnly = true)
public class AlertServiceImpl implements AlertService {

private AlertDAO alertDAO;

public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}

}

我想知道如果我忘记了注释会发生什么:

// Oops! Forgot to use transactional annotation 
public class AlertServiceImpl implements AlertService {

private AlertDAO alertDAO;

public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}

}

当 alertDAO 实现如下时:

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

// no annotation here either
public class HibernateAlertDAO extends HibernateDaoSupport implements AlertDAO {

public List<Alert> getAlerts(){
// some implementation details that define queryString

Query query = getSession().createQuery(queryString);
List<Alert> alerts = query.list();

return alerts;
}

}

Hibernate 似乎允许我在没有注释的情况下从数据库中获取数据。

这种粗心大意的后果是什么?可能发生的最坏情况是什么?

最佳答案

根据文档 (Spring docs),它只是元数据,表明方法或接口(interface)可以由“事务感知”的东西配置(即 <tx:annotation-driven/>)。

只有 tx:annotation-driven 而没有 @Transactional我相信您应用了“默认”事务性属性:

  • 传播设置是必需的
  • 隔离级别为默认
  • 事务是读/写的。
  • 事务超时默认为底层事务系统的默认超时,如果不支持超时,则为无。
  • 任何 RuntimeException 都会触发回滚,而任何已检查的 Exception 都不会。

假设您使用的是 <tx:annotation-driven />通过事务管理器驱动它,然后错过 @Transactional属性意味着您不能应用诸如 readOnlyisolationpropagationrollbackFornoRollbackFor 等属性 等等

我相信 MVC 略有不同 - Hibernate session 直接与 MVC 请求相关联 - 即,当收到请求时,事务开始。

回到你的例子,HibernateDAOSupport中getSession()的代码如下:

protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException
{
return getSession(this.hibernateTemplate.isAllowCreate());
}

依次调用:

/**
* Obtain a Hibernate Session, either from the current transaction or
* a new one. The latter is only allowed if "allowCreate" is true.
*.......
*/
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException {
return getSession(this.hibernateTemplate.isAllowCreate());
}

最终调用:

/** 
* ....
* @param allowCreate whether a non-transactional Session should be created
* when no transactional Session can be found for the current thread
* ....
*/
private static Session doGetSession(
SessionFactory sessionFactory, Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate)

从根本上说,Transaction:Session 与 1:1 AFAIK 绑定(bind),并且在没有事务的情况下运行的唯一方法是使用 say JBoss,它有一个“内置”持久层,为您提供事务性(在幕后) .即使您调用getQuery()getSession() 之后您仍然有效地发生事务,因为它是 JDBC/Hibernate 连接。

关于java - 没有 @Transactional 注释的 Spring 托管事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com