概念介绍
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注解