首页 > 其他分享 >Transaction-声明式事务

Transaction-声明式事务

时间:2023-04-03 21:34:01浏览次数:34  
标签:事务管理 事务 Transaction Spring Transactional 回滚 timeout 声明

https://blog.csdn.net/m0_38140207/article/details/106875188

1. 事务概述

  • 原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。
  • 一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。
  • 隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰。
  • 持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。

2. Spring事务管理

使用原生的JDBC API进行事务管理 获取数据库连接Connection对象 取消事务的自动提交 执行操作 正常完成操作时手动提交事务 执行失败时回滚事务 关闭相关资源

TransactionFilter{
	 try{
         //获取连接
         //设置非自动 提交
         chain.doFilter();
         //提交
       }catch(Exception e){
           //回滚 
       }finllay{
           //关闭连接释放资源
       }      
}

2.2 声明式事务管理

  • 大多数情况下声明式事务比编程式事务管理更好:它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。
  • 事务管理代码的固定模式作为一种横切关注点,可以通过AOP方法模块化,进而借助Spring AOP框架实现声明式事务管理。
  • Spring在不同的事务管理API之上定义了一个抽象层,通过配置的方式使其生效,从而让应用程序开发人员不必了解事务管理API的底层实现细节,就可以使用Spring的事务管理机制。 Spring既支持编程式事务管理,也支持声明式的事务管理。

2.3 Spring提供的事务管理器

  • Spring的核心事务管理抽象是PlatformTransactionManager,它可以在目标方法运行前后进行事务控制(事务切面)

20201115003712

2.4 快速为某个方法添加事务

  • 配置出这个事务管理器使其工作
  • 开启基于注解的事务
  • 给事务方法加@Transactional注解
<!-- 事务控制 -->
<!--1:配置事务管理器(切面)让其进行事务控制,须导入面向切面编程的几个包  
spring-aspects-4.0.0.RELEASE.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
 -->
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!-- 控制住数据源 -->
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!--2:开启基于注解的事务控制模式;依赖tx名称空间  -->
<tx:annotation-driven transaction-manager="tx"/>

<!--3:给事务方法加注解@Transactional  -->
 @Transactional
    public void checkOut(String username,String isbn)

20201115004156

Transactional的配置项(属性)

image.png

timeout-int(秒为单位)——超时:事务超出指定执行时长后自动终止并回滚

@Transactional(timeout=3)

readOnly=true:加快查询速度;不用管事务那一堆操作了。

@Transactional(timeout=3,readOnly=ture)

事务回滚:默认发生运行时异常都回滚,发生编译时异常不会回滚

  • rollbackFor-Class[]——原本不回滚(默认编译时异常不回滚)的异常指定其回滚;
@Transactional(timeout=3,readOnly=false,rollbackFor={FileNotFoundException.calss})
  • 异常分类: 运行时异常(非检查异常)﹔可以不用处理;默认都回滚; 编译时异常{要么try-catch,要么在方法上声明throws默认不回滚;
# 源代码异常回滚 数据库不变
@Transactional(timeout=3,readOnly=true)
public void checkOut(String username,String isbn) {
    //1.减库存
    this.bookDao.updateStock(isbn);
    System.out.println("减库存完成!");
    //故意引入异常
    int a = 1/0;
    //根据isbn查询价格
    Integer price = this.bookDao.getPrice(isbn);
    //2.减账户余额
    this.bookDao.updateBalance(username,price);
    System.out.println("结账完成!");
}

Snipaste_2020-11-15_13-51-43

# 加上 noRollbackFor 异常当回滚的也不会回滚
@Transactional(timeout=3,noRollbackFor={ArithmeticException.class})

标签:事务管理,事务,Transaction,Spring,Transactional,回滚,timeout,声明
From: https://blog.51cto.com/u_15993308/6167565

相关文章

  • @Transactional(propagation=Propagation.REQUIRED)数据库事务的7种传播行为特性
      ClassA{@Transactional(propagation=propagation.REQUIRED)publicvoidaMethod{Bb=newB();b.bMethod();}}//inB.javaClassB{@Transactional(propagation=propagation.REQUIRED)publicvoidbMethod......
  • 全栈声明式可观测:KubeVela 开箱即用且灵活定制的云原生应用洞察
    作者介绍:殷达,KubeVelaMaintainer,阿里云高级工程师,深度参与了KubeVela混合云多集群管理、可扩展工作流、可观测等核心能力体系的建设KubeVela[1]是一个开箱即用的现代化应用交付与管理平台,它通过统一的应用模型、可编程可扩展的架构,帮助企业构建统一的平台,向上为不同场景......
  • .NetCore中使用分布式事务DTM的二阶段消息
    一、概述二阶段消息是DTM新提出的,可以完美代替现有的事务消息和本地消息表架构。无论从复杂度、性能、便利性还是代码量都是完胜现有的方案。相比现有的消息架构借助于各种消息中间件比如RocketMQ等,DTM自己实现了无需额外的学习成本。它能够保证本地事务的提交和全局事务提交是......
  • 你是如何访问慕课的--DNS域名解析&回溯HTTP事务处理过程
    你是如何访问慕课的--DNS域名解析已经介绍了与HTTP协议有着密切关系的TCP/IP协议,接下来介绍的DNS服务也是与HTTP协议有着密不可分的关系通常我们访问一个网站,使用的是主机名或者域名来进行访问的,因为相对IP地址(一组纯数字),域名更容易让人记住,但TCP/IP协议使用的是IP地......
  • 2·1浏览器背后的故事、2·2HTTP协议的前世今生、2·3透过TCPIP看HTTP、2·4DNS域名解
    浏览器背后的故事Http·超文本传输协议(HTTP)是一种通信协议它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器·HTTP是一个属于应用层的面向对象的协议由于其简捷快速的方式,适用于分布式超媒体信息系统它于1990年提出经过几年的使用与......
  • Spring 框架的事务管理
    1、事务的概念事务是一个不可分隔的工作单元,其中的SQL语句要么全都执行,要么全都不执行,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。在企业级应用程序开发中,事务管理是必不可少的技术,用来确保数据的完整性和一致性。事务的四个特性:ACID......
  • 分布式事务讲解之CAP,2PC,3PC,TCC
    目录1CAP1.1CAP原则1.1.1数据一致性1.1.2图示讲解1.1.2.1一致性1.1.2.2可用性1.1.2.3分区容错性1.2CAP如何舍弃1.3eureka与zookeeper区别1.4CAP对应的模型和应用1.4.1CAwithoutP1.4.2CPwithoutA1.4.3APwihtoutC1.4.4常见注册中心1.5BASE理论2分布式事务2.1......
  • Oracle PL/SQL 自治事务
    自治事务是PL/SQL静态SQL的一个特性,可声明于存储过程、函数或触发器中。它是和主事务分开的事务,可以独立执行事务,不与主事务共享锁、资源,不受主事务提交的影响。自治事务可以用来记录日志,记录计数值,而不受主事务回滚的影响。--创建自治事务的存储过程createorreplaceprocedur......
  • Mysql 事务隔离机制、锁机制、MVCC多版本并发控制隔离机制、日志机制、
    原子性(Atomicity)当前事务的操作要么同时成功,要么同时失败。原子性由undolog日志来实现。一致性(Consistency):使用事务的最终目的,由其它3个特性以及业务代码正确逻辑来实现。隔离性(lsolation):在事务并发执行时,他们内部的操作不能互相干扰,隔离性由MySQL的各种锁以及MVC......
  • chatgpt: 在ts中如何声明一个全局类型
    在TypeScript中声明全局类型可以使用declareglobal关键字,使得在应用的任何地方都能够使用该类型。例如,如果需要在TypeScript中声明一个全局的foo变量,可以使用以下代码:declareglobal{varfoo:string;}上述代码中的declareglobal关键字表示声明一个全局类型,......