【Java进阶营】Spring特性介绍-事务机制

x33g5p2x  于2022-04-26 转载在 Java  
字(3.4k)|赞(0)|评价(0)|浏览(702)

概念介绍

1、事务:事务是指逻辑上一组操作,这组操作要么全部成功,要么全部失败。

2、事务特性:ACID(原子性、一致性、隔离性、持久性)

(1)原子性:不可分割的逻辑单元,事务中操作要么发生,要么不发生;

  (2) 一致性:事务前后数据的完整性必须保持一致;

  (3)隔离性:用户并发访问数据库时,多个事务之间相互独立,互不影响;

  (4)持久性:一个事务一旦提交,它对数据库中的改变就是永久性的。

三、事务管理的API介绍

Spring事务管理器高层抽象主要有三个接口:

1、PlatformTransactionManager事务管理器

(1)Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现

       【1】使用Spring JDBC或MyBatis进行持久化数据时使用          

         org.springframework.jdbc.datasource.DataSourceTransactionManager 

       【2】使用Hibernate3.0版本进行持久化数据时使用

         org.springframework.orm.hibernate3.HibernateTransactionManager

       【3】使用JPA进行持久化数据时使用

         org.springframework.orm.jpa.JpaTransactionManager

       【4】使用JDO进行持久化数据时使用

         org.springframework.orm.jdo.JdoTransactionManager

       【5】使用一个JTA实现来管理事务,在一个事务跨越多个数据库时必须使用

         org.springframework.transaction.jta.JtaTransactionManager

   (2)PlatformTransactionManager源码

public abstract interface PlatformTransactionManager

{

public abstract TransactionStatus getTransaction(TransactionDefinition paramTransactionDefinition)

throws TransactionException;

public abstract void commit(TransactionStatus paramTransactionStatus)

throws TransactionException;

public abstract void rollback(TransactionStatus paramTransactionStatus)

throws TransactionException;

}

(2)TransactionDefinition事务定义信息(隔离、传播、超时、只读)

TransactionDefinition源码:

public abstract interface TransactionDefinition{

// 事务传播行为:如果存在当前事务,则加入到当前事务中,否则新增一个事务

public static final int PROPAGATION_REQUIRED = 0;

// 事务传播行为:如果存在当前事务,则加入到当前事务中,否则以非事务方式执行

public static final int PROPAGATION_SUPPORTS = 1;

// 事务传播行为:如果存在当前事务,则加入到当前事务中,否则抛出异常

public static final int PROPAGATION_MANDATORY = 2;

// 事务传播行为:如果存在当前事务,则把当前事务挂起,新建一个新的事务

public static final int PROPAGATION_REQUIRES_NEW = 3;

// 事务传播行为:以非事务方式执行,如果存在当前事务,则挂起当前事务

public static final int PROPAGATION_NOT_SUPPORTED = 4;

// 事务传播行为:以非事务方式执行,如果存在当前事务,则抛出异常

public static final int PROPAGATION_NEVER = 5;

// 事务传播行为:如果存在当前事务,则嵌套执行事务。否则按TransactionDefinition.PROPAGATION_REQUIRED属性执行

public static final int PROPAGATION_NESTED = 6;

// 事务隔离性:默认数据库隔离级别(mysql:REPEATABLE_READ;oracle:READ_COMMITTED)

public static final int ISOLATION_DEFAULT = -1;

// 事务隔离性:读未提交,会产生脏读、重复读、幻读(场景:查询)

public static final int ISOLATION_READ_UNCOMMITTED = 1;

// 事务隔离性:读提交,会产生重复读、幻读(场景:修改)

public static final int ISOLATION_READ_COMMITTED = 2;

// 事务隔离性:重复读,会产生幻读(场景:插入)

public static final int ISOLATION_REPEATABLE_READ = 4;

// 事务隔离性:序列化,避免了脏读、重复读、幻读,事务按顺序执行,消耗资源,性能低

public static final int ISOLATION_SERIALIZABLE = 8;

// 事务超时时间设置,默认超时时间设置不生效

public static final int TIMEOUT_DEFAULT = -1;

// 获取事务传播行为

public abstract int getPropagationBehavior();

// 获取事务隔离级别

public abstract int getIsolationLevel();

// 获取事务超时时间设置

public abstract int getTimeout();

// 获取事务是否是只读状态

public abstract boolean isReadOnly();

// 获取事务名称

public abstract String getName();

}

(3)TransactionStatus事务具体运行状态

TransactionStatus源码:

public abstract interface TransactionStatus

extends SavepointManager, Flushable

{

// 事务状态:是否是一个新事务

public abstract boolean isNewTransaction();

// 事务状态: 返回这个事务是否在内部携带一个保存点, 也就是说,已经创建为基于保存点的嵌套事务。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

public abstract boolean hasSavepoint();

// 事务状态:设置只回滚

public abstract void setRollbackOnly();

// 事务状态:是否设置只回滚状态

public abstract boolean isRollbackOnly();

// 事务状态:将底层会话刷新到数据存储(如果适用):例如,所有受影响的Hibernate / JPA会话。

public abstract void flush();

// 事务状态:是否完成了事务

public abstract boolean isCompleted();

}

四、事务总结

Spring将事务分成两类:

(1)编程式事务

TransactionTemplate事务模板

  手动编写事务代码,代码侵入性强(很少使用)

(2)声明式事务

【1】基于TransactionProxyFactoryBean方式

           需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean代理或者增强

  【2】基于AspectJ的XML方式

           一旦配置好之后,类上不需要添加任何东西

  【3】基于@Transactional注解方式

           配置简单,需要在业务类上配置@Transactional注解

相关文章