专栏首页Hcode网站SSM框架(三)Spring中的声明式事务

SSM框架(三)Spring中的声明式事务

什么是事务

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。

事务的四大属性(ACID)

  • 原子性(atomicity):事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(consistency):一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中。
  • 隔离性(isolation):可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(durability):事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中。

Spring中的事务管理

  1. 编程式事务管理:将事务管理代码嵌到业务方法中来控制事务的提交和回滚,但是每个事务操作业务逻辑中包含额外的事务管理代码。加重不必要的重复代码。
  2. 声明式事务管理:将事务管理作为横切关注点,通过aop方法模块化。Spring中通过Spring AOP框架支持声明式事务管理。即是用AOP横切事务管理到指定的切点中。

声明式事务的使用

配置文件中导入文件约束

xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

JDBC的事务管理器

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

配置事务通知

<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
       <!--name为方法名,propagation可以约束事务操作,*表示所有方法-->
       <tx:method name="add" propagation="REQUIRED"/>
       <tx:method name="get" read-only="true"/>
       <tx:method name="*" propagation="REQUIRED"/>
   </tx:attributes>
</tx:advice>
  • propagation_requierd(Spring默认行为):如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
  • propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
  • propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
  • propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
  • propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
  • propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。

配置AOP

<!--配置aop在Dao层中织入事务-->
<aop:config>
   <aop:pointcut id="txPointcut" expression="execution(* top.hcode.dao.*.*(..))"/>
   <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

这样声明式事务就完成了,可以测试一波~

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JUC并发编程(一)多线程使用和线程池

    一个进程往往可以包含多个线程,至少包含一个! Java默认有几个线程? 2 个: mian、GC 对于Java而言:Thread、Runnable、Callab...

    HcodeBlogger
  • JUC并发编程(二)认识volatile,单例模式,各种锁

    JMM : Java内存模型,不存在的东西,概念!约定! 关于JMM的一些同步的约定: 1. 线程解锁前,必须把共享变量立刻刷回主存。 2. 线程加锁前,必须读...

    HcodeBlogger
  • Redis 相关命令和Springboot中的使用

    Redis是单线程的!Redis是基于内存操作,速度很快~,Redis的性能瓶颈跟机器的内存和网络带宽有关!跟CPU没有多大关系。

    HcodeBlogger
  • MySQL(十三)之MySQL事务

    前言   这段时间自己会把之前学的东西都总结一遍,希望对自己以后的工作中有帮助。其实现在每天的状态都是很累的,但是我要坚持!   进入我们今天的正题:   为什...

    用户1195962
  • MySQL 事务

      事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级...

    Demo_Null
  • mysql学习笔记(二)事务隔离

    银行转账例子,你要给朋友转账100,并且卡里只有100元。在期间转账中还可以做一些列操作,比如余额查询、余额转出、余额转入等操作,如果业务中显示转账成功...

    虞大大
  • MySQL深入学习第三篇 -事务隔离:为什么你改了我还看不见?

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。

    越陌度阡
  • Java事务解析(事务的基本操作+隔离的等级+事务的四大特性+事务的概念)

    如果一个包含多个步骤的业务操作,这些操作被事务管理,那么这些操作要么同时成功要么同时失败

    一只胡说八道的猴子
  • 阿里分布式事务框架GTS开源啦!

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

    用户5224393
  • 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    悟空聊架构

扫码关注云+社区

领取腾讯云代金券