我是否正确理解Spring @Transactional行为?

时间:2010-03-04 03:56:07

标签: java hibernate spring transactions

我希望有人可以确认我对Spring服务中的交易行为的理解。

首先,我是否相信在使用TransactionManager时,必须从@Transactional方法中调用导致数据库持久性的所有服务,以便更新持久保存到数据库?

例如,给定以下类:

class MyService
{
   CustomerImporter customerImporter
   CustomerDAO customerDAO

   public void updateCustomer(Customer customer)
   {
       customerDAO.update(customer)
   }

   public List<Customer> importCustomers(String url)
   {
       customerImporter.importCustomers(url);
   }
   return customerDAO.getFromURL(url);
}

如果updateCustomer不是@Transactional,该方法会有效吗?

此外,如果在CustomerImporter上方法importCustomers()标记为@Transactional但MyService未标记,则更新是否会持久保存到数据库?

2 个答案:

答案 0 :(得分:4)

  

首先,我相信是正确的   当使用TransactionManager时,   所有导致的服务   必须持久化到数据库   从@Transactional中调用   方法以便更新   坚持到db?

情况并非如此,不是。如果没有注释,数据库更新将以非事务方式完成,但它们仍将发生。

  

如果不是updateCustomer   @Transactional,方法会有   有什么影响?

     

此外,如果在CustomerImporter上   方法importCustomers()被标记   @Transactional但MyService不是,   将更新持续到   数据库?

实际上,@Transactional和DAO之间没有神奇的关联。注释定义了事务边界,每次输入或退出@Transactional注释方法时,Spring都将启动/回滚/提交事务。

如果你执行一个@Transactional - 带注释的方法,然后该方法调用另一个类中的另一个方法,并且另一个方法调用另一个方法,最终完成一些数据库工作,那么你仍然在事务中。注释可以在任何有意义的地方进行。例如,如果您选择,可以将@Transactional放在MVC控制器上,它仍然有效,您只需将事务边界“向上移动”。

答案 1 :(得分:2)

是的,您是对的 - 您需要@Transactional + <tx:annotation-driven />才能使交易有效。

另一种方法是在xml中使用spring的<aop:功能。

至于你的第二个问题,它将在同一个交易中执行。请查看transaction propagation,了解如何在事务方法上定义此行为。