说说 Spring 的事务管理模型

Spring 在高层次建立了统一的事务抽象以及一致的编程模板 。

Spring 提供了事务模板类 TransactionTemplate。 通过 TransactionTemplate 并配合使用事务回调 TransactionCallback 来指定具体的持久化操作,从而通过编程的方式来实现事务管理。

通过声明,在 IoC 配置中指定事务的边界和事务属性, Spring 就会自动在指定的事务边界上应用事务属性 。

因为大部分的应用都是单数据源的,只有少部分需要使用多数据源的 JTA 事务。所以在单数据源的场景中,Spring 使用底层数据源来管理事务。如果遇到多数据源的场景,Spring 会引用应用服务器中的 JNDI 资源来实现 JTA 事务。在 Spring 中,不管我们是否使用了 JTA 事务,事务的管理模型都是相同的。

1 事务管理模型

Spring 事务管理 SPI ( Service Provider Interface )抽象模型层主要包括 3 个接口:

  • PlatformTransactionManager
  • TransactionDefinition
  • TransactionStatus

TransactionDefinition 定义了事务隔离级别、超时时间、是否只读以及事务传播规则等事务属性。PlatformTransactionManager 依据 TransactionDefinition 中的配置信息来创建事务。而 TransactionStatus 描述了事务的当前状态。

2 TransactionDefinition

TransactionDefinition 定义了与事务管理控制相关的配置信息。

1、事务隔离级别:

在此,定义了与 java.sql.Connection 相同的四种隔离级别。此外,还定义了默认隔离级别(ISOLATION_DEFAULT ),它会使用底层数据库所定义的默认隔离级别。

2、事务传播机制:

3、事务超时设置:

int TIMEOUT_DEFAULT = -1;

事务执行超过时限设置,即超时后,回滚事务。

4、只读状态:

boolean isReadOnly();

设置为只读状态之后,可以提供执行性能。如果试图修改只读事务中的事务,将抛出异常。

3 TransactionStatus

TransactionStatus 代表的是某个事务的运行状态。事务管理器就是通过它,来获取事务的运行状态。因为继承了 SavepointManager 接口,所以也可以回滚事务。

SavepointManager 接口有这些方法:

方法说明
Object createSavepoint()创建保存点。
void rollbackToSavepoint(Object savepoint)将事务回滚到特定保存点。
void releaseSavepoint(Object savepoint)事务提交后,释放保存点。

注意: 如果底层事务不支持 “保存点”,那么将抛出 NestedTransactionNotSupportedException。

TransactionStatus 中,除了继承了 SavepointManager 接口方法之外,还定义了以下方法:

方法说明
boolean hasSavepoint()判断当前事务内部是否创建了保存点,它用于嵌套事务的情况。
boolean isNewTransaction()判断当前事务是否是新事务。如果返回 false,则表示当前事务是一个已存在的事务,或者当前操作未运行在事务环境。
boolean isCompleted()判断当前事务是否已结束。
boolean isRollbackOnly()判断当前事务是否被标注为 “rollback-only”。
void setRollbackOnly()将当前事务标注为 “rollback-only”。标注之后,事务管理器将显式调用回滚命令或抛出异常等方式来回滚当前事务。

4 PlatformTransactionManager

PlatformTransactionManager 定义了三个方法,它们都没有绑定 JNDI。

方法说明
TransactionStatus getTransaction(TransactionDefinition definition)从当前事务环境中,获取一个已存在的事务,或者创建一个新事务,实际返回的是事务的状态。
void commit(TransactionStatus status)依据事务状态,来提交事务。如果事务被标注为 “rollback-only”,则回滚事务。
void rollback(TransactionStatus status)回滚事务。如果 commit() 方法抛出异常,那么 Spring 会隐式调用 rollback()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值