事务总述

事务引入缘由: 并发情况下对数据库的连续操作进行管理。

重点目录:

  1. 事务特性(ACID): 原子性、一致性、隔离型、持久性
  2. 事务的隔离级别
  3. 事务的传播机制。
  4. @Transactional标签的使用
  5. @Transactional标签不作用 @Transaction不起作用解决方法
  6. 事务嵌套,项目示例异常: Transaction silently rolled back because it has been marked as rollback-only

 Spring对事务管理源码解析:

public @interface Transactional {
    //@AliasFor: 指定别名(及两者相同)。使用需求: 1. 成对出现。2.必须有默认值。3.属性和默认值类型必须相同 
    @AliasFor("transactionManager")
    String value() default "";
    @AliasFor("value")
    String transactionManager() default "";
    //事务传播方式
    Propagation propagation() default Propagation.REQUIRED;
    //事务隔离级别
    Isolation isolation() default Isolation.DEFAULT;    
    //超时时间
    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
    //是否只读
    boolean readOnly() default false;
    //指定异常类回滚
    Class<? extends Throwable>[] rollbackFor() default {};
    //指定异常类名回滚
    String[] rollbackForClassName() default {};
    //指定异常类不回滚
    Class<? extends Throwable>[] noRollbackFor() default {};
    //指定异常类名不回滚
    String[] noRollbackForClassName() default {};
}
//事务传播方式
public enum Propagation {
    // 需要事务。它是默认传播行为,如果当前存在事务,就沿用当前事务,否则新建一个事务运行子方法
    REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
    // 支持事务,如果当前存在事务,就沿用当前事务,如果不存在 ,则继续采用无事务的方式运行子方法
    SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
    // 必须使用事务,如果当前没有事务,则会抛出异常,如果存在当前事务 ,就沿用当前事务
    MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
    // 无论当前事务是否存在,都会创建新事务运行方法,这样新事务就可以拥有新的锁和隔离级别等特性,与当前事务相互独立
    REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
    // 不支持事务,当前存在事务时,将挂起事务,运行方法
    NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
    // 不支持事务,如果当前方法存在事务,则抛出异常,否则继续使用无事务机制运行
    NEVER(TransactionDefinition.PROPAGATION_NEVER),
    // 在当前方法调用子方法时,如果子方法发生异常,只因滚子方法执行过的 SQL,而不回滚当前方法的事务
    NESTED(TransactionDefinition.PROPAGATION_NESTED);

    private final int value;

    Propagation(int value) { this.value = value; }

    public int value() { return this.value; }

}
//事务隔离级别
public enum Isolation {
	//使用数据库的隔离级别
	DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
	//读不提交
	READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
	//读提交
	READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
	//重复读
	REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
	//序列化
	SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);

	private final int value;

	Isolation(int value) {
		this.value = value;
	}

	public int value() {
		return this.value;
	}
}

通过Spring中提供的事务源码,清晰的可以看到事务中的囊括点。

事务的实现方式:AOP。AOP的实现方式:动态代理。

(共同学习:https://blog.csdn.net/weixin_38289303/article/details/100058865、                                            https://blog.csdn.net/weixin_38289303/article/details/99908331

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章