Spring及Spring boot 第四章-第二节 Spring声明式事务管理 @Transactional

本文详细探讨了Spring声明式事务管理,重点介绍了事务传播行为、隔离级别、timeout和readOnly属性。事务传播行为解释了Spring如何处理方法间的事务边界。隔离级别涉及到并发控制,timeout规定了事务必须在设定时间内完成,否则会回滚。readOnly属性用于标记事务为只读,限制了增删改操作。此外,还讨论了基于异常的事务回滚规则,如rollbackFor和noRollbackFor。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
    @AliasFor("transactionManager")
    String value() default "";

    @AliasFor("value")
    String transactionManager() default "";

    String[] label() default {};
	/*事务传播行为*/
    Propagation propagation() default Propagation.REQUIRED;
	/*事务隔离级别*/
    Isolation isolation() default Isolation.DEFAULT;
	/*超时时间*/
    int timeout() default -1;

    String timeoutString() default "";
	/*是否只读*/
    boolean readOnly() default false;
	/*回滚*/
    Class<? extends Throwable>[] rollbackFor() default {};

    String[] rollbackForClassName() default {};
	/*不回滚*/
    Class<? extends Throwable>[] noRollbackFor() default {};

    String[] noRollbackForClassName() default {};
}

结合数据库事务实现来看,其中比较陌生的概念应该是事务传播行为,这个概念出现的原因是Spring声明式事务处理事务的单元是方法级别,

这个Spring声明式事务的源码实现过程中也可以体会到,不管你是将@Transactional放到类之上还是方法之上,最终都会在方法执行之前进行拦截并在方法执行全过程中执行创建事务、回滚事务、提交事务。当执行到一个新的方法,又会重新执行这些逻辑。

也就是说一般执行一个方法就可以开一个事务,这和数据库事务有些差别,数据库事务可以在一个事务中执行多个方法,所以Spring执行多个方法的过程就会考虑是共用一个事务还是重新使用新的事务。

事务传播行为

在这里插入图片描述

隔离级别

这属于对数据库事务的Java实现,对并发的考虑

timeout

事务需要在一定时间内进行提交,如果没提交进行回滚
默认值为-1,设置时间以秒为单位进行计算。

readOnly

是否只读

读:查询操作,写:添加修改删除操作
readOnly默认值false,表示可以查询,可以添加修改删除。
设置readOnly值为true,只能查询操作

异常

在Java代码中实现事务,这和数据库sql语句中实现事务有所不同,它会将Java的异常机制耦合到数据库事务中,这个是sql处理事务时没有遇到过的场景,也是我们之后回滚失效的原因。

rollbackFor 回滚

(1)设置查询哪些异常进行事务回滚

noRollbackFor

(2)设置出现哪些异常不进行事务回滚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值