欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring事务部分知识点整理

程序员文章站 2022-03-20 16:18:04
[TOC] 1、数据库事务基础概念   数据库事务是对数据库一次一系列的操作组成的单元,可以包含增删改查或者只有单个操作。数据库事务具有四大特性(ACID),ACID是数据库事务正确执行的四个基本要素的缩写。分别指:原子性(Atomicity)、一致性(Consistency)、隔离性(I ......

1、数据库事务基础概念

  数据库事务是对数据库一次一系列的操作组成的单元,可以包含增删改查或者只有单个操作。数据库事务具有四大特性(acid),acid是数据库事务正确执行的四个基本要素的缩写。分别指:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。一个支持事务(transaction)的数据库,必需要支持这四种特性,否则在事务过程(transaction processing)当中无法保证数据的正确性。

1.1、 原子性(atomicity)
  原子性是指一个事务中的操作单元要不全部成功提交要不全部失败回滚。
 

1.2、 一致性(consistency)
  一致性是指数据库在事务执行前后处于一致的状态,比如说消费和账户余额,消费了100,那么账户余额必然减少了100。在单个事务的运行的情况下通过事务的原子性可以保证事务的一致性,在多事务并行的情况下可通过事务的隔离性保证一致性。一致性还可以细分为强一致性、最终一致性等。
 
1.3、 隔离性(isolation)
  隔离性是指在多个事务并行的情况下事务相互之间的影响,不同的隔离级别事务之间相互产生的影响不同。sql标准规范定义了四个隔离性级别,分别是脏读、读写提交、可重复度、序列化,这四个级别稍后详细说明。每种数据库默认支持的隔离级别不同,oracle默认支持读写提交,mysql默认支持可重复读。
 
1.4、 持久性(durability)
  持久性是指事务一旦提交,对于数据库来讲,这个事务对数据的修改是永久性的,不可改变。
 

2、spring中注解事务的使用

  @transactional 注解,一般用于service层,如果需要在ctrl层使用,必须在springmvc的配置文件中配置注解相关的bean。注解可以表示到类上或者public方法上。如果表示到类上那么该类所有的public方法的事务将被spring管理。@transactional注解有很多属性,不同属性配置不同的值对事务的执行有很大的影响,我们需要掌握不同属性值的含义。

2.1、 propagation 传播性

  spring 的传播性是指一次请求中多个操作如何用事务管理。是采用同一个事务管理,还是每个操作使用不同的事务管理。这些都是由传播性决定的。
  required:这个是默认值,每次调用方法的时候如果已经存在事务则沿用存在的事务否则开启一个新事物。
 
  requires_new:请求到达时,不管是否有事务存在,都会开启一个新的事务。
 
  nested:嵌套事务,调用方法如果抛出异常只回滚自己内部的sql,而不回滚主方法的sql,如果数据库支持保存点技术(savepoint),则使用保存点否则和requires_new一样。
以上三个传播性是企业比较常用的三种。还有一些用的比较少的如supports(如果存在事务则沿用,否则没有事务)、never(不支持事务)、not_support、mandatory(方法必须在事务中运行)。

2.2、 isolation 隔离性

  sql标准定义了数据库事务隔离性的四个级别,分别是:脏读、读写提交、可重复读(针对的是同一条记录)、序列化。通过数据库的锁保证不同的隔离性下事务的正确执行以达到数据库的一致性。
 
  脏读:在俩个事务并行的情况下,一个事务可以读取另外一个事务未提交的修改。另外一个事务最终可能不提交数据导致出现脏读现象。
 
  读写提交:一个事务可以读取另外一个事务已经提交后的数据。但是这种情况下有不可重复读的问题,比如说:在读取后其他事务可能修改这条数据,导致后续数据修改或者判断异常,这个问题称为不可重复读。
 
  可重复读:这个级别可以解决不可重复读的问题,在这个级别下,同一条数据只能由一个事务操作,即将多个事务序列化了(操作同一条数据的事务)。这个情况下存在的问题是幻读,比如说查询结果有10条数据,但是导出的时候却导出了11条数据,因为在这个期间其他事务写入了数据,但不是同一条数据。
 
  序列化:所有的事务排队执行,效率较差.。
 
2.3、 timeout
  事务超时时间,单位是妙,超时时会抛出异常,导致事务回滚。
 
2.4、 readonly
  是否开启只读事务,开启只读事务数据库会对该次事务操作做一系列优化,不同的数据库优化方式不同。
 
2.5、 rollbackfor
  指定需要回滚的异常,如果不指定异常那么spring事务只有在遇到运行时异常时才会回滚事务,而在遇到非运行时异常时则不会回滚事务。@transactional(rollbackfor=exception.class) 指定exception,则所有的异常都会导致事务回滚。
 

2.6、 norollbackfor
  定义异常,当事务中发生所定义的异常时事务不进行回滚,会继续提交事务。
 

3、spring事务使用注意场景

  • @transactional 注解 对静态方法和非public方法无效。事务注解对象是依赖spring aop 实现的,aop代理的是对象,必须通过代理对象调用方法,事务才能起作用。而静态方法无法被对象使用,私有方法也无法在对象外使用,所以事务注解对这俩类方法无效。
     
  • 自调用,在同一个类中一个公开方法调用另外一个公开方法,第二个公开方法上标识的@transaction注解无效。(spring aop 动态代理的原因)。可以通过容器获取bean(此时的bean是一个代理bean)然后调用第二个公开方法
     
  • ctrl中调用多个标有@transactional 注解的service方法时,会开启多个事务而不是同一个事务。
     
  • 切勿长时间占用事务,数据库连接是非常宝贵的资源,长时间占用事务,会导部分数据请求超时。
     
  • spring根据是否抛出异常来决定是否回滚事务,所以如果异常被捕获了的话,spring的事务是不会回滚的。