我有这样的服务,注明了@Transactional
@Transactional
@Service
public class Contact_Service {
....
在我的控制器中,我没有@Transactional
,有时我直接使用一些持久层方法来搜索和保存我的对象,一切都很好:
@Controller
public class GestionAO {
....
@RequestMapping(...)
public String alerte() {
contact_respository.findOne(...) ;
...
contact_respository.save(...) ;
我的问题,因为我的控制器不在交易中,我会遇到一些问题吗? 在某些情况下我的对象是否可以保存? 我会遇到并发问题吗?
答案 0 :(得分:3)
拥有@Transactional
注释的目的是在单个事务中执行多个数据库操作。如果一个操作失败,则应该回滚整个事务。否则,这可能导致数据完整性问题。
最重要的是在服务层方法上使用@Transactional
。因为那是一层知道工作单位和用例的人。在某些情况下,您将不得不调用多个DAO层方法,所有操作都是从服务层调用的,而且主要来自单个方法。因此,最好将服务层方法注释为@Transactional
。
总结一下,您必须在服务层方法上添加@Transactional
注释。
答案 1 :(得分:2)
当您只有一个保存电话时,现在看起来很好。如果从Controller执行多个DML或DDL操作,您将无法进行事务管理。您将失去ACID behavior的transactions offer。
答案 2 :(得分:2)
您应该只使用@Transactional注释服务。为了确保单个事务下的所有数据库操作,建议在服务中添加一个包含所有数据操作的新方法,并在控制器中调用这个新方法。