【问题标题】:Spring managed transactions @Transactional annotationSpring托管事务@Transactional注解
【发布时间】:2018-03-28 22:32:08
【问题描述】:

传播设置是必需的。

@Transactional(propagation = Propagation.REQUIRED)

事务是读/写的。

在哪些场景中使用它们?请给我举例说明

【问题讨论】:

    标签: spring jpa transactions spring-transactions


    【解决方案1】:

    Spring事务默认是

    @Transactional(propagation = Propagation.REQUIRED)
    

    所以你不需要指定传播属性。

    那么,@Transactional 对 spring 组件的注解是什么意思?

    • Spring 框架将启动一个新事务并执行所有方法并最终提交该事务。

    • 但如果application context中不存在事务,那么spring容器将启动一个新事务。

    • 如果多个方法配置为Propagation.REQUIRED,则事务行为在逻辑上以嵌套方式分配给每个方法,但它们都在同一个物理事务下。

    那么,结果如何?
    结果是如果任何嵌套事务失败,则整个事务将失败并回滚(不要在 db 中插入任何值)而不是提交。

    例子:

    @Service
    public class ServiceA{
    
        @Transactional(propagation = Propagation.REQUIRED)
        public void foo(){
            fooB();
        }
    
        @Transactional(propagation = Propagation.REQUIRED)
        public void fooB(){
            //some operation
        }
    
    }
    

    说明: 在这个例子中,foo() 方法分配了一个事务行为,在 foo() 内部调用了另一个方法 fooB(),它也是事务性的。 这里fooB() 就foo() 而言充当嵌套事务。如果fooB() 因任何原因失败,那么foo() 也无法提交。而是回滚。

    【讨论】:

    • 也许跑题了,但我只是想指出,如果从 foo() 调用 fooB() 上的 @Transactional 注释无效,因为它绕过了处理事务的 spring 代理管理。 stackoverflow.com/a/1099284/4261642
    【解决方案2】:

    这个注解只是为了帮助 Spring 框架管理你的数据库事务。

    假设您有一个写入数据库的服务 bean,并且您希望确保写入是在事务中完成然后您使用

    @Transactional(propagation = Propagation.REQUIRED)
    

    这是一个 Spring 服务 bean 的小例子。

    @Service
    class MyService {
    
        @Transactional(propagation = Propagation.REQUIRED)
        public void writeStuff() {
    
          // write something to your database
        }   
    }
    

    Transactional 注释告诉 Spring:

    • 此服务方法要求在事务中执行。
    • 如果在执行服务方法时抛出异常,Spring 将回滚事务并且不会将数据写入数据库。

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 1970-01-01
      • 2019-08-16
      • 2012-12-14
      • 2011-07-18
      • 2019-01-09
      • 2023-02-16
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多