前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring对事务的支持

Spring对事务的支持

作者头像
吉林乌拉
发布2019-09-17 16:31:23
5420
发布2019-09-17 16:31:23
举报
文章被收录于专栏:吉林乌拉

上几篇中我们主要介绍了有关数据库事务相关的知识,在这一篇中,我们将重点了解一下,在spring中是怎么对事务进行支持的。在其它的文章中我们知道spring DAO为了支持不同的持久化技术,于是提供了模板类的方式使之支持不同的持久化技术,那么spring的事务管理也是一样的,它也是采用了这种方式,于是就提供了 TransactionTemplate模板类。在spring中我们可以使用TransactionTemplate模板类,及事务回调TransactionCallback就可以通过编码的方式实现事务管理,并且无须关注资源获取、释放、事务同步和异常处理等操作。

spring事务管理的好处是声明式事务管理,也就是说可以通过IOC配置中指定边界和事务属性,这样spring会自动在指定的事务边界上应用事务属性。

在spring的事务管理中,主要有3个接口,他们分别是:PlatformTransactionManager、TransactionDefinition、TransactionStatus。他们3个具体的关联关系如下:

下面我们详细了解一下上面3个接口的具体作用。

TransactionDefinition:用户描述事务的隔离级别、超时时间、是否为只读事务和事务传播规则等控制事务具体行为的事务属性。PlatformTransactionManager根据TransactionDefinition提供的事务属性配置信息创建事务,并用TransactionStatus描述这个事务的激活事务的状态。在上面我们介绍过TransactionDefinition用来描述事务的相关属性,那么下面我们具体看一下在TransactionDefinition中都包括哪些事务属性。

  • 事务隔离:当前事务和其它事务的隔离程度。在TransactionDefinition中定义了和java.sql.Connection接口中一样的隔离级别:ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_REPEATABLE_READ、ISOLATION_SERIALIZABLE。上面介绍的这些常量正好对应在其它文章中提到过的数据库的隔离级别。除此之外TransactionDefinition还包括默认的隔离级别ISOLATION_DEFAULT。它表示使用底层数据库的默认隔离级别。
  • 事务传播:在正常的情况下事务中执行的所有代码都会在一个事务中运行,但spring为我们提供了几种可选的事务传播类型:简单的参与到现有的事务中、或者挂起当前事务、或者创建一个新的事务。
  • 事务超时:事务在超时前能运行多久,超过时间后,事务将回滚。
  • 只读状态:因为只读事务不修改任何数据,所以在有只读操作时可以对只读事务做优化处理,提高运行性能。

TransactionStatus:TransactionStatus表示的是事务的具体运行状态。也就是通过TransactionStatus可以获取到事务运行期的状态信息,也可以通过该接口间接的回滚事务。这是因为该接口继承了SavepointManager,而SavepointManager接口又支持JDBC3.0中新增的保存点的分段事务控制能力。下面我们简单了解一下SavepointManager中所包括的方法。

  • Object createSavepoint():创建一个保存点对象,以保证事务可以支持回滚到保存点上,也可以调用releaseSavepoint()方法释放一个已经确定不用的保存点。
  • void rollbackToSavepoint(Object var1):将事务回滚到特定的保存点上,被回滚的保存点将自动释放。
  • void releaseSavepoint(Object var1):释放一个保存点,如果事务提交,那么所有的保存点都将释放。

除了上述已有的方法外,TransactionStatus还扩展了以下SavepointManager中没有的方法:

  • boolean hasSavepoint():判断当前事务是否创建了保存点。
  • boolean isNewTransaction():判断当前事务是否是一个新的事务,如果返回false则表示当前事务是一个已经存在的事务,或者当前操作未运行在事务环境中。
  • boolean isCompleted():判断当前事务是否已经结束,已经提交事务或者事务回滚都任务当前事务已经结束。
  • boolean isRollbackOnly():判断当前事务是否已经被标识为rollback-only。
  • void setRollbackOnly():将当前事务设置为rollback-only。通过该标识spring将此事务回滚。

PlatformTransactionManager:在其它的文章中使我们知道JDBC的事务只能提交或者回滚。在spring中PlatformTransactionManager的作用就是做上述功能的。下面我们看一下PlatformTransactionManager中的所涉及到的方法及其作用。

  • TransactionStatus getTransaction(TransactionDefinition var1):该方法根据事务定义的信息从事务环境中返回一个已存在的事务,或者创建一个新的事务,并用TransactionStatus记录这个事务的运行状态。
  • void commit(TransactionStatus var1):根据事务的状态提交事务,如果事务已经被标识为rollback-only,则该方法将执行回滚操作。
  • void rollback(TransactionStatus var1):将事务回滚,如果调用commit()方法抛出一异常时,则spring会默认调用rollback()方法。

上面我们介绍了spring中有关事务的主要接口,下面我们继续了解一下,在spring中这些接口的具体实现,实际上spring为不同的持久化技术都提供了不同的实现,相关的实现类如下:

spring就是通过这此实现类进而实现spring对事务的管理的,介绍了这么多,我们来看一下在spring中到底怎么用代码的方式也就是声明式事务管理。

这样我们的数据源就支持事务管理了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档