【问题标题】:Spring transactional on a singleton class - issues单例类的 Spring 事务处理 - 问题
【发布时间】:2014-01-14 04:58:38
【问题描述】:

我有一个服务(Hibernate DAOs),它从数据库中检索数据并将其返回给客户端。其中一位开发人员在类本身上插入了@Transactional,而没有设置任何属性。 spring的应用上下文中的bean声明指定这个服务是单例的。

现在的问题是,当该服务中的多个方法被调用时,spring 是否仍然在多个方法调用中保持会话处于活动状态?这会给我带来什么问题?这是一个好习惯吗?代码如下:sn-p。

@Transactional
public class SomeService implements IService{

public TestObjects returnTestObj(){
  return   testDao.findById(11);
}

public TestObjects returnAnotherTestObj(){
   //some processing in the session.
  return testDao.findById(11);
}

}

谢谢。

【问题讨论】:

    标签: spring hibernate spring-transactions transactional


    【解决方案1】:

    由于@Transactional(和<tx:annotation-driven> 或相应的Java 配置)Spring 将代理您的SomeService bean。该代理将拥有事务行为,即。打开Session,启动Transaction,提交或回滚Transaction,然后关闭Session

    当此服务中的多个方法被调用时, spring 仍然在多个方法调用中保持会话处于活动状态

    Session 将保持打开状态,直到方法返回。例如

    SomeService service = ...// get bean
    service.returnTestObj(); // session boundary
    service.returnAnotherTestObj(); // other session boundary
    

    这会给我带来什么问题?这是一个好习惯吗?

    您必须小心使用 Hibernate 代理和延迟加载。这不是好的或坏的做法,这取决于你想做什么。可以通过配置相对自定义。

    【讨论】:

      【解决方案2】:

      长话短说 @Transactional 注释将导致 Spring 在方法调用之前检查事务是否已打开——并根据设置打开新的/使用现有的——因此您的代码无需以编程方式打开并提交交易。

      通常事务将在方法体的末尾关闭(提交),但是如果调用方方法也被注释,那么事务可能会继续。

      这部分是 Spring 面向方面的编程特性。如果您想了解更多信息,则必须花时间阅读手册。

      【讨论】:

        猜你喜欢
        • 2011-11-16
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多