Spring事务管理机制

Spring事务管理的四个优点:

  1. 提供一致的对于不同的事务管理的API
  2. 支持声明式事务管理(重点)
  3. 编程事务管理(在开发中应用比较少)
  4. 优秀的整合与Spring的数据访问

我们重点讲解spring的事务管理的相关的API,还有声明式事务管理

Spring事务管理主要提供了三个接口来完成

  1. org.springframework.transaction.PlatformTransactionManager

    这是一个事务管理器,可以来选择相关的平台(jdbc hibernate jpa…)

  2. TransactionDefinition

    它定义事务的一些相关信息 例如 隔离 传播 超时 只读

  3. TransactionStatus

    它主要描述事务具体的运行状态

 

PlatformTransactionManager

平台事务管理器

在不同的持久化层解决技术它的事务代码不一样。

JDBC开发

    Connection con=……;

    con.setAutoCommit(false);//开启事务

    con.rollback();

    con.commit();

Hibernate开发

    Session session=….;

    Transaction t=session.beginTransaction();

    t.commit();

    t.rollback();

PlatformTransactionManager接口API

DataSourceTransactionManager 主要针对于JdbcTemplate开发 MyBatis开发

HibernateTransactionManasger主要针对于Hibernate开发

JpaTransactionManager 主要针对于JPA开发。

 

TransactionDefinition

它描述的是事务的定义信息。

    

在TransactionDefinition中定义了大量的常量

隔离

以下是关于隔离性相关信息

事务的四个特性 ACID 原子性 一致性 隔离性 持久性。

不考虑事务隔离性有什么问题?

    脏读,不可重复读 虚读。

ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring中选项)

ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读

ISOLATION_READ_COMMITTED 可以解决脏读 会产生不可重复读与虚读。

ISOLATION_REPEATABLE_READ 可以解决脏读,不可重复读 解决不了虚读

ISOLATION_SERIALIZABLE 串行化,可以解决所有问题

对于不现的数据库,它的底层默认事务隔离级别不一样。

Oracle数据库它默认的是read_committed

Mysql数据库它默认的是repeatable_read.

 

超时

默认值是-1 它使用的是数据库默认的超时时间。

 

只读

    它的值有两个true/false,如果选择true一般是在select操作时

    

传播

它解决的是两个被事务管理的方法互相调用问题。它与数据库没关系,是程序内部维护的问题。

以下定义了事务的传播行为

以上操作中最常用的三种:

PROPAGATION_REQUIRED 默认值 两个操作处于同一个事务,如果之前没有事务,新建一个事务

PROPAGATION_REQUIRES_NEW

两个操作处于不同的事务

PROPAGATION_NESTED
它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用

 

以下了解

PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务

PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常

PROPAGATION_NOT_SUPPORTED 以非事务运行,如果有事务存在,挂起当前事务

PROPAGATION_NEVER 以非事务运行,如果有事务存在,抛出异常

 

TransactionStatus

它定义了事务状态信息,在事务运行过程中,得到某个时间点的状态

 

声明式事务管理

事务管理方式

  1. 编码方案 不建议使用,它具有侵入性。在原有的业务代码基础上去添加事务管理代码
  2. 声明式事务控制,基于AOP对目标进行代理,添加around环绕通知。

    这种方案,它不具有侵入性,不需要修改原来的业务代码

     

基于xml配置声明式事务管理方案

第一步:在applicationContext.xml文件中添加aop与tx的名称空间

第二步:在applicationContext.xml文件中配置

    Spring提供的advice是传统的spring advice

  1. 声明事务管理器

  2. 配置通知

    Spring为我们提供了一个TransactionInterceptor来完成增强

    对于这个增强,我们可以使用spring为我们提供的一个标签<tx:advice>来完成操作        

  3. 配置切面

    因为使用的是传统的spring的advice,需要使用<aop:advisor>

基于annotation声明式事务管理方案

可以使用@Transaction来在类或方法上添加声明式事务管理

注意:需要在applicationContext.xml文件中使用

相当于开启注解事务控制

 

问题:关于xml方式与annotation方式的优缺点?

    从简单上来说,使用注解更方便。

    使用配置的方案,可以对事务配置进行集中维护。

    

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值