Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring托管事务@Transactional注释_Spring_Jpa_Transactions_Spring Transactions - Fatal编程技术网

Spring托管事务@Transactional注释

Spring托管事务@Transactional注释,spring,jpa,transactions,spring-transactions,Spring,Jpa,Transactions,Spring Transactions,传播设置是必需的 @Transactional(propagation = Propagation.REQUIRED) 事务是读/写的 在哪种情况下使用这些?请给我举个例子解释一下这个注释只是为了帮助Spring框架管理您的数据库事务 假设您有一个向数据库写入数据的服务bean,并且您希望确保在您使用的事务中完成写入 @Transactional(propagation = Propagation.REQUIRED) 下面是Spring服务bean的一个小示例 @Service class

传播设置是必需的

@Transactional(propagation = Propagation.REQUIRED)
事务是读/写的


在哪种情况下使用这些?请给我举个例子解释一下

这个注释只是为了帮助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将回滚事务,并且不会向数据库写入任何数据

    • Spring事务默认为

      @Transactional(propagation = Propagation.REQUIRED)
      
      因此,不需要指定传播属性

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

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

      • 但如果
        应用程序上下文中不存在任何事务,则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代理,因此没有任何效果。