相关疑难解决方法(0)

了解Spring事务 - 当事务方法调用另一个事务方法时会发生什么?

只是为了理解Spring事务的工作原理,我想知道在下面的情况下会发生什么,其中一个方法被标记为@Transactional调用另一个标记为的方法@Transactional.

假设配置使用所有默认设置.

@Service("myService")
@Transactional
public MyService{
   public void myServiceMethod(){
      myDAO.getSomeDBObjects();
   }
}

@Repository("myDAO")
@Transactional
public MyDAOWithUsesBeyondMyService{
   public void getSomeDBObjects(){...}
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我要输入MyService.myServiceMethod()它,显然会启动一个交易.然后,钻进myDAO.getSomeDBObjects()会发生什么?交易已经存在的事实会导致没有新的交易产生,或者我在这里创建两个交易?

关于传播的文档(引用如下)似乎涵盖了这一点,但我想验证我的理解,这对于我的处女大脑来说有点多了解一下.

传播:通常,在事务范围内执行的所有代码都将在该事务中运行.但是,您可以选择在事务上下文已存在时执行事务方法时指定行为.例如,代码可以继续在现有事务中运行(常见情况); 或者可以暂停现有交易并创建新交易.Spring提供了EJB CMT中熟悉的所有事务传播选项.要了解Spring中事务传播的语义,请参见第10.5.7节"事务传播".

java spring transactions

27
推荐指数
1
解决办法
2万
查看次数

从另一个方法调用的@Transactional方法不会获得事务

在Spring中,@Transactional如果没有注释的方法,则注释的方法 将获得新事务,但我注意到,如果从非事务性方法调用事务方法,则事务方法不会获取任何事务.这是代码.

@Component
public class FooDao {
    private EntityManager entityManager;

    @PersistenceContext
    protected void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Transactional
    public Object save(Object bean) {
        return this.entityManager.merge(bean);
    }

    public Object saveWrap(Object bean) {
        return save(bean);
    }
}

@Component
public class FooService {
    private FooDao fooDao;

    public void save(Object bean) {
        this.fooDao.saveWrap(bean); // doesn't work.
        this.fooDao.save(bean); // works
    }
}
Run Code Online (Sandbox Code Playgroud)

saveWrap()是一种常规方法,它调用save()哪些是事务性的,但saveWrap()不会保留任何更改.

我正在使用Spring 3和Hibernate 3.我在这里做错了什么?谢谢.

java spring hibernate jpa

22
推荐指数
3
解决办法
1万
查看次数

标签 统计

java ×2

spring ×2

hibernate ×1

jpa ×1

transactions ×1