spring的事务传播怎么实现的

fiy 其他 33

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring的事务传播是通过Transactional注解来实现的。在Spring框架中,我们可以使用Transactional注解来标记一个方法或类,以指示该方法或类应该在一个事务中执行。

    Transactional注解有几个属性可以用来控制事务的传播行为,包括Propagation、Isolation、readOnly、timeout和rollbackFor等。

    1. Propagation属性:指定事务的传播行为。它可以有以下几个取值:

      • REQUIRED:如果当前已经存在一个事务,那么该方法将在该事务中运行;否则,将创建一个新事务。
      • REQUIRES_NEW:不管当前是否存在事务,该方法都将在新的事务中运行。如果当前存在事务,那么它将挂起该事务。
      • SUPPORTS:如果当前已经存在一个事务,那么该方法将在该事务中运行;否则,它可以在没有事务的情况下运行。
      • NOT_SUPPORTED:该方法将在没有事务的情况下运行。如果当前存在事务,那么它将挂起该事务。
      • MANDATORY:该方法必须在一个事务中运行。如果当前不存在事务,那么将抛出异常。
      • NEVER:该方法不能在一个事务中运行。如果当前存在事务,那么将抛出异常。
    2. Isolation属性:指定事务的隔离级别。它可以有以下几个取值:

      • DEFAULT:使用默认的隔离级别,由具体的数据库驱动决定。
      • READ_UNCOMMITTED:可以读取未提交的数据,存在脏读的问题。
      • READ_COMMITTED:只能读取已提交的数据,避免了脏读的问题。
      • REPEATABLE_READ:可以多次读取相同的数据,确保了数据的一致性。
      • SERIALIZABLE:禁止并发访问,确保了数据的完整性。
    3. readOnly属性:指定事务是否只读。如果设置为true,则表示只读事务,不会对数据库进行修改操作。

    4. timeout属性:指定事务的超时时间,单位为秒。如果事务在指定的时间内没有完成,则会回滚。

    5. rollbackFor属性:指定回滚的异常类型。这些异常类型可以是任何Throwable的子类,当方法抛出指定的异常时,事务将会回滚。

    通过使用这些属性,我们可以灵活地控制事务的传播行为,以实现不同的事务处理场景。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring框架中,事务传播是通过TransactionPropagation枚举类来实现的。Spring提供了多种事务传播行为,可以根据业务需求灵活的选择适合的事务传播方式。

    1. REQUIRED(默认):如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择,也是最常用的传播行为。适用于绝大多数的业务场景。

    2. SUPPORTS:如果当前有事务,则加入到这个事务中,如果当前没有事务,则以非事务的方式执行。适用于不需要事务支持,但是如果存在事务,仍然需要进行事务管理的场景。

    3. MANDATORY:如果当前有事务,则加入到这个事务中,如果当前没有事务,则抛出异常。适用于需要强制要求事务存在的场景。

    4. REQUIRES_NEW:每次都会新建一个事务,如果当前有事务,则挂起当前事务,新建一个事务执行。适用于需要独立的事务操作,互不影响的场景。

    5. NOT_SUPPORTED:以非事务的方式执行操作,如果当前有事务,则挂起当前事务。适用于不需要事务支持且不希望受到事务影响的场景。

    以上是Spring中常用的事务传播行为,可以根据不同的业务场景选择合适的传播行为。在Spring中使用事务传播有助于管理和控制事务的行为,提高了系统的可靠性和一致性。

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

    Spring的事务传播是通过TransactionSynchronizationManager类和TransactionInterceptor类来实现的。

    1. TransactionSynchronizationManager类:这个类是Spring事务管理中的核心类之一,在事务传播中起到了重要的作用。它主要负责管理当前线程中的事务状态,提供了一组静态方法来进行事务操作的管理。

    2. TransactionInterceptor类:这个类是Spring事务传播中的拦截器,用于拦截方法调用,并在方法执行前后进行事务操作的处理。它实现了AOP(面向切面编程)的方式,通过在目标方法的前后增加事务管理的逻辑。

    下面是Spring事务传播的实现方式:

    1. REQUIRED(默认):如果当前存在一个事务,那么加入这个事务,如果不存在事务,则创建一个新的事务。这是最常见的传播行为,大部分的业务方法采用的是这种传播方式。

    2. SUPPORTS:如果当前存在一个事务,那么加入这个事务,如果不存在事务,则以非事务的方式执行。这种传播行为适用于一些非关键的业务方法,它不会主动去开启一个新的事务,而是利用现有的事务。

    3. MANDATORY:如果当前存在一个事务,那么加入这个事务,如果不存在事务,则抛出异常。这种传播行为适用于某些必须在事务中执行的方法,如果没有事务,那么执行这个方法是没有意义的。

    4. REQUIRES_NEW:每次都会开启一个新的事务,如果当前存在一个事务,那么将当前事务挂起。这种传播行为适用于某些比较独立的业务方法,它会主动去开启一个新的事务,不受当前事务的影响。

    5. NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在一个事务,那么将当前事务挂起。这种传播行为适用于一些不需要事务支持的方法,它会主动去挂起当前事务,以非事务的方式执行操作。

    6. NEVER:以非事务的方式执行操作,如果当前存在一个事务,那么抛出异常。这种传播行为适用于一些不允许在事务中执行的方法,如果存在事务,那么抛出异常。

    7. NESTED:如果当前存在一个事务,那么在嵌套事务中执行,如果不存在事务,则创建一个新的事务。嵌套事务是独立于外部事务的,它可以独立进行提交或回滚操作。

    以上就是Spring事务传播的实现方式。通过配置和使用TransactionSynchronizationManager类和TransactionInterceptor类,可以实现不同的事务传播行为,以满足不同的业务需求。

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

400-800-1024

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

分享本页
返回顶部