专栏首页代码人生事务处理(一) - spring事务

事务处理(一) - spring事务

Spring的事务管理

原理

Spring是通过org.springframework.transaction.PlatformTransactionManager接口来实现事务的管理。同时应对不同的场景,提供不同的PlatformTransactionManager实现类来实现管理事务。下面是常见的应用场景。

JDBC事务

如果使用JDBC来进行数据持久化,Spring使用DataSourceTransactionManager类来实现事务管理(mybatis也可以使用JDBC的事务管理,mybatis的事务机制在下延伸中讲解)。Spring配置如下

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
</bean>

Hibernate事务

如果使用Hibernate来进行数据持久化,Spring使用HibernateTransactionManager类来实现事务管理。Spring配置如下

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

延伸:mybatis的事务机制

MyBatis的事务管理分为两种形式:

  1. 使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等
  2. 使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理

Spring事务的隔离级别

Spring除了jdbc的四种事务读未提交ISOLATION_READ_UNCOMMITTED、读已提交ISOLATION_READ_COMMITTED、可重复读ISOLATION_REPEATABLE_READ、串行化ISOLATION_SERIALIZABLE以外,还有ISOLATION_DEFAULT,即使用数据库默认事务隔离级别。

Spring事务的隔离级别配置

<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven order="1" proxy-target-class="true"/>
<tx:advice id="transactionAdvice">
    <tx:attributes>
        <tx:method name="*" isolation="READ_COMMITTED" rollback-for="Exception"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="transactionPointcut" expression="execution(* com.lc.service..*Service.*(..))"/>
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" order="2"/>
</aop:config>

Spring事务的传播行为

7种传播行为介绍

Spring的事务传播行为有一下7种

  • REQUIRED:支持当前事务,如果当前没有事务就新创建一个事务
  • REQUIRES_NEW: 新建事务,如果当前存在事务,就把当前事务挂起。
  • NOT_SUPPORTED: 在非事务环境下执行,如果当前存在事务,就把当前事务挂起
  • SUPPORTS: 支持当前事务,如果当前没有事务,就在非事务环境下执行
  • MANDATORY: 支持当前事务,如果当前没有事务,就抛出异常。
  • NEVER: 在非事务环境下执行,如果当前存在事务就抛出异常。
  • NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则进行与REQUIRED类似的操作;拥有多个可以回滚的保存点,内部回滚不会对外部事务产生影响。它只对DataSourceTransactionManager事务管理器起效。

事务传播行为的理解,事务是可以嵌套的,如一个方法存在事务,它调用一个方法也存在事务,如果调用的方法的事务是REQUIRED时,调用的方法不会新建事务,而是使用老的事务;如果调用方法的事务是REQUIRESNEW时,调用的方法会新建事务,而之前的事务会挂起,等这个方法结束再调用,不过这会导致事务不同步,即内部方法成功了,没有回滚,外部方法失败回滚了。

使用方式

@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public List<User> select(){
    return userMapper.select();
}

@Transactional(readOnly= true, propagation= Propagation.REQUIRES_NEW)
public int delete(Integer id){
    return userMapper.delete(id);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring事务失效的两种情况

    spring的事务默认是对RuntimeException进行回滚,而不继承RuntimeException的不回滚。因为在java的设计中,它认为不继承Run...

    逝兮诚
  • 很好理解的分布式事务

    事务是保证一系列操作是一个整体,要么都执行,要么都不执行。比如A给B转账,A扣钱了,B的账户的钱也要加上去,不能出现A扣钱B不加钱,或者B加钱A不扣钱的情况。在...

    逝兮诚
  • 事务处理(二) - 数据库事务

    事务的作用是将一系列操作作为一个整体,一但其中出现问题,会回滚到事务的开始状态。即事务维护了数据的完整性和一致性。

    逝兮诚
  • 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。通过对本教程的学习,您将能够理解 Spring 事务...

    java达人
  • 每天一道面试题(19)

    (1)Spring支持编程式事务管理和声明式事务管理。许多Spring框架的用户选择声明式事务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概...

    剑走天涯
  • 阿里分布式事务框架GTS开源啦!

    就在9号这天,阿里分布式事务框架GTS开源了一个免费社区版Fescar,看到了这个消息内心非常的激动!在微服务系统中,分布式事务一直是痛点,也是难点。社区里也有...

    用户5224393
  • “大”事务引起的锁等待分析案例

    生产环境数据库在某一刻突然发现大量活跃连接,而且大部分状态是updating。问题出现在周六上午,持续了大概三、四分钟,得益于我们自己的快照程序,拿到了当时现场...

    wubx
  • 多库多事务降低数据不一致概率

    一、案例缘起 我们经常使用事务来保证数据库层面数据的ACID特性。 举个栗子,用户下了一个订单,需要修改余额表,订单表,流水表,于是会有类似的伪代码: star...

    架构师之路
  • 猿蜕变16——一文搞懂Spring事务花式玩法

    看过之前的蜕变系列文章,相信你对事务有了应用方面的认识。但是这些要完成你的蜕变还不够,考虑到大家的基础知识,我们继续回到spring的话题上来,我们一起聊一聊S...

    山旮旯的胖子
  • 『MySQL』深入理解事务的来龙去脉

    距离上一篇MySQL的文章已经过去一个月了,终于有时间来写写关于MySQL的事务了。本文内容默认是针对 MySQL InnoDB 引擎。

    天澄技术杂谈

扫码关注云+社区

领取腾讯云代金券