spring的事务传播怎么实现的
-
Spring的事务传播是通过Transactional注解来实现的。在Spring框架中,我们可以使用Transactional注解来标记一个方法或类,以指示该方法或类应该在一个事务中执行。
Transactional注解有几个属性可以用来控制事务的传播行为,包括Propagation、Isolation、readOnly、timeout和rollbackFor等。
-
Propagation属性:指定事务的传播行为。它可以有以下几个取值:
- REQUIRED:如果当前已经存在一个事务,那么该方法将在该事务中运行;否则,将创建一个新事务。
- REQUIRES_NEW:不管当前是否存在事务,该方法都将在新的事务中运行。如果当前存在事务,那么它将挂起该事务。
- SUPPORTS:如果当前已经存在一个事务,那么该方法将在该事务中运行;否则,它可以在没有事务的情况下运行。
- NOT_SUPPORTED:该方法将在没有事务的情况下运行。如果当前存在事务,那么它将挂起该事务。
- MANDATORY:该方法必须在一个事务中运行。如果当前不存在事务,那么将抛出异常。
- NEVER:该方法不能在一个事务中运行。如果当前存在事务,那么将抛出异常。
-
Isolation属性:指定事务的隔离级别。它可以有以下几个取值:
- DEFAULT:使用默认的隔离级别,由具体的数据库驱动决定。
- READ_UNCOMMITTED:可以读取未提交的数据,存在脏读的问题。
- READ_COMMITTED:只能读取已提交的数据,避免了脏读的问题。
- REPEATABLE_READ:可以多次读取相同的数据,确保了数据的一致性。
- SERIALIZABLE:禁止并发访问,确保了数据的完整性。
-
readOnly属性:指定事务是否只读。如果设置为true,则表示只读事务,不会对数据库进行修改操作。
-
timeout属性:指定事务的超时时间,单位为秒。如果事务在指定的时间内没有完成,则会回滚。
-
rollbackFor属性:指定回滚的异常类型。这些异常类型可以是任何Throwable的子类,当方法抛出指定的异常时,事务将会回滚。
通过使用这些属性,我们可以灵活地控制事务的传播行为,以实现不同的事务处理场景。
1年前 -
-
在Spring框架中,事务传播是通过TransactionPropagation枚举类来实现的。Spring提供了多种事务传播行为,可以根据业务需求灵活的选择适合的事务传播方式。
-
REQUIRED(默认):如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择,也是最常用的传播行为。适用于绝大多数的业务场景。
-
SUPPORTS:如果当前有事务,则加入到这个事务中,如果当前没有事务,则以非事务的方式执行。适用于不需要事务支持,但是如果存在事务,仍然需要进行事务管理的场景。
-
MANDATORY:如果当前有事务,则加入到这个事务中,如果当前没有事务,则抛出异常。适用于需要强制要求事务存在的场景。
-
REQUIRES_NEW:每次都会新建一个事务,如果当前有事务,则挂起当前事务,新建一个事务执行。适用于需要独立的事务操作,互不影响的场景。
-
NOT_SUPPORTED:以非事务的方式执行操作,如果当前有事务,则挂起当前事务。适用于不需要事务支持且不希望受到事务影响的场景。
以上是Spring中常用的事务传播行为,可以根据不同的业务场景选择合适的传播行为。在Spring中使用事务传播有助于管理和控制事务的行为,提高了系统的可靠性和一致性。
1年前 -
-
Spring的事务传播是通过TransactionSynchronizationManager类和TransactionInterceptor类来实现的。
-
TransactionSynchronizationManager类:这个类是Spring事务管理中的核心类之一,在事务传播中起到了重要的作用。它主要负责管理当前线程中的事务状态,提供了一组静态方法来进行事务操作的管理。
-
TransactionInterceptor类:这个类是Spring事务传播中的拦截器,用于拦截方法调用,并在方法执行前后进行事务操作的处理。它实现了AOP(面向切面编程)的方式,通过在目标方法的前后增加事务管理的逻辑。
下面是Spring事务传播的实现方式:
-
REQUIRED(默认):如果当前存在一个事务,那么加入这个事务,如果不存在事务,则创建一个新的事务。这是最常见的传播行为,大部分的业务方法采用的是这种传播方式。
-
SUPPORTS:如果当前存在一个事务,那么加入这个事务,如果不存在事务,则以非事务的方式执行。这种传播行为适用于一些非关键的业务方法,它不会主动去开启一个新的事务,而是利用现有的事务。
-
MANDATORY:如果当前存在一个事务,那么加入这个事务,如果不存在事务,则抛出异常。这种传播行为适用于某些必须在事务中执行的方法,如果没有事务,那么执行这个方法是没有意义的。
-
REQUIRES_NEW:每次都会开启一个新的事务,如果当前存在一个事务,那么将当前事务挂起。这种传播行为适用于某些比较独立的业务方法,它会主动去开启一个新的事务,不受当前事务的影响。
-
NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在一个事务,那么将当前事务挂起。这种传播行为适用于一些不需要事务支持的方法,它会主动去挂起当前事务,以非事务的方式执行操作。
-
NEVER:以非事务的方式执行操作,如果当前存在一个事务,那么抛出异常。这种传播行为适用于一些不允许在事务中执行的方法,如果存在事务,那么抛出异常。
-
NESTED:如果当前存在一个事务,那么在嵌套事务中执行,如果不存在事务,则创建一个新的事务。嵌套事务是独立于外部事务的,它可以独立进行提交或回滚操作。
以上就是Spring事务传播的实现方式。通过配置和使用TransactionSynchronizationManager类和TransactionInterceptor类,可以实现不同的事务传播行为,以满足不同的业务需求。
1年前 -