Spring的事务机制

Spring 事务管理机制

    Spring 没有直接提供事务的直接支持,它对外提供统一的 API,真正的事务提供者是实现了这一套 API 的 ORM 框架或者是其他支持事务的框架,例如 Hibernate、Mybatis 等等。
    Spring 对事务管理的抽象层主要包括3个接口,TransactionDefinition、PlatformTansactionManager、TransactionStatus。
    TransactionDefinition 用来描述 XML 配置和注解扫描的事务属性,包括隔离级别、传播属性、超时时间等
    PlatformTansactionManager 根据 TransactionDefinition 提供的事务配置创建事务,并用 TransactionStatus 描述这个事务的状态。
    PlatformTansactionManager 提供了开始事务、提交事务和回滚事务三个方法,并要求事务的提供者实现。

Spring 事务分类

    Spring 事务机制主要包括编程式事务和声明式事务。

  • 编程式事务
        编程式事务需要我们用代码实现,它也分为两种,一种是第三方框架实现的事务模板,显示的处理事务,另外一种是原生的事务管理,即用代码实现获取连接、事务提交、回滚、异常处理等操作。
  • 声明式事务
        声明式事务使用 AOP 面向切面编程实现,本质上是在目标方法执行前创建一个事务或者加入一个已有的事务,在执行方法后根据实际情况选择提交或是回滚事务。

Spring 事务管理的接口

    Spring 事务管理主要包括 3 个接口。

  • PlatformTansactionManager(事务管理器):定义了如下三个方法。
# 获取当前事务状态
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
# 当前事务提交
void commit(TransactionStatus status) throws TransactionException;
# 当前事务回滚
void rollback(TransactionStatus status) throws TransactionException;
  • TransactionDefinition(事务定义信息):定义了五个方法;七个事务传播行为的属性;五个隔离级别的属性;一个超时时间的属性
# 七个传播行为的属性:
int PROPAGATION_REQUIRED = 0;           # 默认的传播行为。如果当前存在事务,使用当前事务;如果当前不存在事务,创建一个新事务
int PROPAGATION_SUPPORTS = 1;           # 如果当前存在事务,使用当前事务;如果不存在事务,以非事务方式执行
int PROPAGATION_MANDATORY = 2;          # 强制使用事务,如果当前不存在事务,抛出异常
int PROPAGATION_REQUIRES_NEW = 3;       # 不管当前有没有事务,都要新建一个事务,如果当前存在事务,将当前事务挂起
int PROPAGATION_NOT_SUPPORTED = 4;      # 以非事务方式执行,如果当前存在事务,将当前事务挂起
int PROPAGATION_NEVER = 5;              # 不允许事务,如果当前存在事务,抛出异常
int PROPAGATION_NESTED = 6;             # 如果当前存在事务,那么使用嵌套事务;如果当前不存在事务,操作类似与 PROPAGATION_REQUIRED

# 五个隔离级别的属性(一个 Spring 的默认隔离级别(即使用数据库的隔离级别)和四个数据库对应的隔离级别)
int ISOLATION_DEFAULT = -1;                                                 
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;    
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;        
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;      
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;            

# 超时时间的属性
int TIMEOUT_DEFAULT = -1;               # 使用数据库默认的超时时间

# 五个方法
int getPropagationBehavior();           # 获取当前事务的传播行为
int getIsolationLevel();                # 获取当前事务的隔离级别
int getTimeout();                       # 获取当前事务的超时时间
boolean isReadOnly();                   # 判断当前事务是否只读
String getName();                       # 返回当前事务的名称
  • TransactionStatus(事务运行状态):定义了判断当前事务是否是新创建的事务、当前事务是否有保存点、设置当前事务应该回滚、判断当前事务是否应该回滚、刷新会话中的数据到数据库、当前事务是否已经完成。
boolean isNewTransaction();             # 判断当前事务是否是新事务
boolean hasSavepoint();                 # 判断当前事务是否有保存点
void setRollbackOnly();                 # 设置当前事务需要回滚
boolean isRollbackOnly();               # 判断当前事务是否需要回滚
void flush();                           # 将数据刷新到数据库
boolean isCompleted();                  # 判断当前事务是否完成
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值