【问题标题】:Do I understand Spring @Transactional behaviour correctly?我是否正确理解 Spring @Transactional 行为?
【发布时间】:2010-03-04 03:56:06
【问题描述】:

我希望有人能证实我对 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 没有,更新是否会被持久化到数据库中?

【问题讨论】:

    标签: java hibernate spring transactions


    【解决方案1】:

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

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

    如果 updateCustomer 不是 @Transactional,该方法是否有 有什么效果吗?

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

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

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

    【讨论】:

      【解决方案2】:

      是的,你是对的 - 你需要 @Transactional + &lt;tx:annotation-driven /&gt; 才能进行交易。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-18
        • 2020-04-29
        • 1970-01-01
        • 2011-05-05
        • 2020-11-22
        • 2011-01-29
        • 2016-05-03
        • 2011-03-01
        相关资源
        最近更新 更多