不使用@Transactional并调用持久层方法

时间:2014-12-22 00:37:44

标签: spring hibernate spring-mvc jpa

我有这样的服务,注明了@Transactional

@Transactional
@Service
public class Contact_Service {
   ....

在我的控制器中,我没有@Transactional,有时我直接使用一些持久层方法来搜索和保存我的对象,一切都很好:

@Controller
public class GestionAO {

    ....

    @RequestMapping(...) 
    public String alerte() {

                contact_respository.findOne(...) ;
                ...
                contact_respository.save(...) ;

我的问题,因为我的控制器不在交易中,我会遇到一些问题吗? 在某些情况下我的对象是否可以保存? 我会遇到并发问题吗?

3 个答案:

答案 0 :(得分:3)

拥有@Transactional注释的目的是在单个事务中执行多个数据库操作。如果一个操作失败,则应该回滚整个事务。否则,这可能导致数据完整性问题。

最重要的是在服务层方法上使用@Transactional。因为那是一层知道工作单位和用例的人。在某些情况下,您将不得不调用多个DAO层方法,所有操作都是从服务层调用的,而且主要来自单个方法。因此,最好将服务层方法注释为@Transactional

总结一下,您必须在服务层方法上添加@Transactional注释。

答案 1 :(得分:2)

当您只有一个保存电话时,现在看起来很好。如果从Controller执行多个DML或DDL操作,您将无法进行事务管理。您将失去ACID behaviortransactions offer

答案 2 :(得分:2)

您应该只使用@Transactional注释服务。为了确保单个事务下的所有数据库操作,建议在服务中添加一个包含所有数据操作的新方法,并在控制器中调用这个新方法。