spring中事务是怎么用的

不及物动词 其他 25

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring中的事务是通过@Transactional注解来进行管理的。我们可以在需要添加事务的方法或类上使用@Transactional注解来指定事务的属性。

    在使用@Transactional注解时,可以指定以下属性:

    1. propagation:事务的传播属性,用于定义事务的传播行为。常用的传播属性有:REQUIRED(默认值),表示当前方法必须在一个事务中运行,如果没有事务,则会开启一个新的事务;REQUIRES_NEW,表示当前方法必须在一个新的事务中运行,如果当前存在事务,则会将该事务挂起;SUPPORTS,表示当前方法支持事务,如果没有事务,则以非事务的方式运行;NOT_SUPPORTED,表示当前方法不支持事务,即使存在事务,也会以非事务的方式运行;等等。

    2. isolation:事务的隔离级别,用于定义事务的隔离程度。常用的隔离级别有:DEFAULT(默认值),使用数据库的默认隔离级别;READ_UNCOMMITTED,表示可以读取未提交的数据;READ_COMMITTED,表示只能读取已提交的数据;REPEATABLE_READ,表示可重复读取,即同一事务中多次读取同一数据会得到相同的结果;SERIALIZABLE,表示串行化,即同一事务中多次读取同一数据会得到不同的结果。

    3. timeout:事务的超时时间,用于定义事务的等待时间,超过该时间则事务自动回滚,默认值为-1,表示不设置超时时间。

    4. readOnly:事务的只读属性,用于指定事务是否为只读事务。如果为只读事务,则不允许对数据进行修改操作。

    5. rollbackFor:事务的回滚条件,用于指定哪些异常会触发事务回滚。默认情况下,Spring只会对RuntimeException及其子类进行事务回滚,如果我们还想对其他异常进行事务回滚,则可以使用rollbackFor属性来指定。

    除了@Transactional注解,还可以使用编程式事务管理,通过TransactionTemplate类来实现。我们可以通过TransactionTemplate的execute()方法在一个范围内执行事务,事务的提交和回滚都是由TransactionTemplate来管理的。

    总之,Spring提供了强大而灵活的事务管理机制,我们可以根据实际需求选择合适的注解或编程式方式来管理事务。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring框架中,使用事务是通过@Transactional注解来实现的。事务用于管理数据库操作的一组操作,确保这些操作要么全部成功提交,要么全部回滚。以下是在Spring中使用事务的几个要点:

    1. 事务管理器(Transaction Manager):Spring提供了多个事务管理器实现,可以根据具体数据库使用的事务管理器。常用的事务管理器包括JDBC、Hibernate和JPA等。在Spring配置文件中,需要配置事务管理器的相关信息。

    2. @Transactional注解: @Transactional注解应用在类或方法上,用于标记这个类或方法需要进行事务管理。注解可以设置多个属性,用于指定事务的传播行为(Propagation)、隔离级别(Isolation)、只读性(ReadOnly)和异常回滚规则(RollbackFor等)。

    3. 声明事务边界:通过在方法上添加@Transactional注解,将该方法划定为一个事务边界。当方法开始执行时,Spring会自动创建一个数据库事务,并在方法结束时根据情况,提交事务或者回滚事务。

    4. 事务传播行为:@Transactional注解的propagation属性用于指定事务的传播行为。常用的传播行为包括REQUIRED、REQUIRES_NEW、NESTED等。REQUIRED表示当前方法加入现有的事务,如果没有事务,则创建新事务。REQUIRES_NEW表示当前方法创建一个新事务,如果存在事务则挂起。NESTED表示当前方法在一个已经存在的事务内执行,如果没有事务,则同REQUIRED一样。

    5. 事务隔离级别:@Transactional注解的isolation属性用于指定事务的隔离级别。常用的隔离级别有READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ、SERIALIZABLE等。事务隔离级别用于控制事务之间的相互影响程度和并发性能。

    需要注意的是,在使用Spring事务时,需要确保数据库连接池和事务管理器等资源的正确配置,以及数据库驱动的正确引入和配置。另外,确保在Spring配置文件中开启注解驱动的事务管理,即添加 tx:annotation-driven/

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring中事务的使用方法主要有两种:声明式事务和编程式事务。

    一、声明式事务:
    声明式事务是通过使用@Transactional注解来实现的,可以在类级别或方法级别上使用该注解。

    1. 在配置文件中开启声明式事务管理器:
      在Spring的配置文件中,需要配置一个事务管理器,可以使用Spring自带的事务管理器或者第三方的事务管理器。示例配置如下:
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource" />
    </bean>
    
    1. 在需要添加事务的方法上添加@Transactional注解:
      在需要添加事务的方法上添加@Transactional注解,表示该方法需要进行事务管理。示例代码如下:
    @Transactional
    public void doSomething() {
       //执行具体的业务逻辑
    }
    
    1. 配置事务的属性:
      @Transactional注解还可以配置一些属性来控制事务的行为。常用的属性包括事务的传播行为、事务的隔离级别、事务的超时时间等。示例代码如下:
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 3600, readOnly = false)
    public void doSomething() {
       //执行具体的业务逻辑
    }
    

    二、编程式事务:
    编程式事务是通过Spring的TransactionTemplate来实现的,通过编写代码来显示地控制事务的开启、提交和回滚。

    1. 使用TransactionTemplate进行事务管理:
      示例代码如下:
    @Autowired
    private TransactionTemplate transactionTemplate;
    
    public void doSomething() {
      transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
          //执行具体的业务逻辑
        }
      });
    }
    
    1. 手动控制事务:
      使用TransactionTemplate提供的方法手动控制事务的开启、提交和回滚。示例代码如下:
    @Autowired
    private TransactionTemplate transactionTemplate;
    
    public void doSomething() {
      // 开启事务
      transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
      TransactionStatus status = transactionTemplate.getTransactionManager().getTransaction(transactionTemplate);
      
      try {
          //执行具体的业务逻辑
          //提交事务
          transactionTemplate.getTransactionManager().commit(status);
      } catch (Exception e) {
          //回滚事务
          transactionTemplate.getTransactionManager().rollback(status);
      }
    }
    

    声明式事务和编程式事务的使用方式各有优劣,一般推荐使用声明式事务,因为它可以将事务的管理从具体的业务逻辑中解耦出来,代码更加简洁清晰,并且支持AOP的方式实现事务的代理。编程式事务则适用于需要更加细粒度的事务控制的场景。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部