@Transactional Annotation +用于循环中的数据插入

Kri*_*hna 4 spring hibernate jpa transactions

我正在使用Spring 3,JPA + Hibernate作为CMS应用程序.在该应用程序中,我有一个服务类方法,该方法使用@TransactionalAnnotation with rollBackproperty 进行注释.在该方法中,我使用循环将数据(即实体类)插入表中.对于每个iteration循环,实体类必须保存到数据库中.但它没有发生.提交仅在循环执行完成并退出方法时发生.然后它立即提交并保存所有内容.但是,在这种情况下提交之前,我需要在数据插入数据库之前读取数据.我尝试使用ISOLATION LEVEL读取未提交但由于我使用默认值而不支持JPADialect.还尝试添加hibernate实现,jpaDialect但仍然无法正常工作.请帮助解决此问题.还有一件事,是否有任何方法使用传播所需的方法.

Tom*_*icz 15

你说得对,这是I代表在.由于事务处于隔离状态,因此其他事务在提交之前无法看到它们.但玩隔离级别是一种不好的做法.我宁愿建议你在内部启动和提交的单独事务中运行每一次迭代.

这在Spring中有点棘手,但这是一个例子:

public void batch() {
    for(...) {
        insert(...)
    }
}

//necessarily in a different class!
@Transactional
public void insert() {

}
Run Code Online (Sandbox Code Playgroud)

请注意,batch()不是有注解@Transactional,并insert()已在不同的类(春季服务).评论太久了,但这就是生活.如果你不喜欢它,你可以TransactionTemplate手动使用.

  • 这真的有效吗?“在代理模式下(默认),只拦截通过代理传入的外部方法调用。这意味着自调用,实际上是目标对象内的一个方法调用目标对象的另一个方法,不会导致即使调用的方法用@Transactional 标记,在运行时到实际事务。此外,必须完全初始化代理以提供预期的行为,因此您不应在初始化代码中依赖此功能,即“- spring 参考手册 (2认同)

Nim*_*sky 5

使用循环删除方法上的事务处理annoation.

在循环中调用一个单独的方法来执行保存,使该方法具有事务性