Spring学习之事务注解@Transactional

今天学习spring中的事务注解,在学习Spring注解事务之前需要明白一些事务的基本概念:

  事务:并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务数据库能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

  事务隔离级别:在并发处理数据中,为了保持数据的完整性和正确性,而执行的操作数据方式。

  脏读 :一个事务读取到另一事务未提交的更新数据。

  幻读:一个事务读到另一个事务已提交的insert数据。

  不可重复读: 是指在一个事务内多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据就有可能不一样的。

Spring事务执行机制:

  [email protected]:只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

  [email protected]:默认情况下遇见RuntimeException类型的异常会执行回滚,Exception类型的异常不执行回滚。

  [email protected](rollbackFor=Exception.class) :指定Exception类型的异常进行回滚。

  [email protected](noRollbackFor=Exception.class):指定RuntimeException类型不进行回滚。

Spring事务传播行为:

  [email protected](propagation=Propagation.REQUIRED) :当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。(这个比较常用)

  [email protected](propagation=Propagation.PROPAGATION_SUPPORTS) :当前没有事务,则以非事务方式执行,如果有事务则以事务方式执行。

  [email protected](propagation=Propagation.PROPAGATION_MANDATORY) :使用当前的事务,如果当前没有事务,就抛出异常。

  [email protected](propagation=Propagation.PROPAGATION_REQUIRES_NEW) :新建事务,如果当前存在事务,把当前事务挂起。

  [email protected](propagation=Propagation.PROPAGATION_NOT_SUPPORTED) :以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  [email protected](propagation=Propagation.PROPAGATION_NEVER) :以非事务方式执行,如果当前存在事务,则抛出异常。

  [email protected](propagation=Propagation.PROPAGATION_NESTED) :如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。(这个比较常用)

Spring事务隔离级别:

  @Transactional(isolation = Isolation.ISOLATION_DEFAULT):这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

  @Transactional(isolation = Isolation.ISOLATION_READ_UNCOMMITTED):该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据,该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别

  @Transactional(isolation = Isolation.ISOLATION_READ_COMMITTED):该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

  @Transactional(isolation = Isolation.ISOLATION_REPEATABLE_READ):该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。

  @Transactional(isolation = Isolation.ISOLATION_SERIALIZABLE):所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

常用数据库的隔离级别:

   MYSQL:默认为REPEATABLE_READ

   ORACLE:默认隔离级别是READ_COMMITTED

   PostgreSQL:默认隔离级别是READ_COMMITTED

  

时间: 2024-10-12 12:03:07

Spring学习之事务注解@Transactional的相关文章

spring学习2:基于注解+xml实现ioc和依赖注入

spring学习2:基于注解+xml实现ioc和依赖注入 一.在spring配置文件中开启spring对注解的支持 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

23. Spring 事务注解@Transactional和异常捕获

一. 事务注解限制条件 1. 不允许在private方法上面 2. 不能在非事务方法里面调用事务方法 二. 实现机制-异常捕获 Describes transaction attributes on a method or class. This annotation type is generally directly comparable to Spring's org.springframework.transaction.interceptor.RuleBasedTransactionA

Spring学习笔记事务(二)

鲁春利的工作笔记,好记性不如烂笔头 用 @Transactional 注解声明式地管理事务 Spring 还允许简单地用 @Transactional 注解来标注事务方法(只能标注公有方法).在 Bean 配置文件中增加 <tx:annotation-driven> 元素声明, 并为之指定事务管理器.如果事务处理器的名称是 transactionManager, 在<tx:annotation-driven> 元素中可以省略 transaction-manager 属性,元素会自动

Spring学习8-Spring事务管理(编程式事务管理)

一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一起失败.    1)jdbc事务:每个Connection都带有一个事务,只是默认被设置为自动提交.一个连接可以有多个事务.对于JDBC,只有在同一个连接内,才有讨论是否提交的前提. 2)Hibernate事务:本质上也是使用JDBC来处理事务.但是不是直接操作,而是使用Session来操作事务.S

Spring 事务注解@Transactional

事务管理一般有编程式和声明式两种,编程式是直接在代码中进行编写事物处理过程,而声名式则是通过注解方式或者是在xml文件中进行配置,相对编程式很方便. 而注解方式通过@Transactional 是常见的.我们可以使用@EnableTransactionManagement 注解来启用事务管理功能,该注解可以加在启动类上或者单独加个配置类来处理. 1.Transactional 注解的属性 name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器

Spring事务注解@Transactional失效的问题

在项目中发现事务失效,使用@Transactional注解标注的Service业务层实现类方法全部不能回滚事务了,最终发现使用因为Spring与shiro进行整合之后导致的问题,将所有的Service层实现类都添加如下注解 @Scope(proxyMode= ScopedProxyMode.TARGET_CLASS) 将代理方式换成CGLib的代理方式之后得以解决,最终不明原因,如有看到这篇博客并知道答案的朋友请留言告知 如果事务不能回滚,也需要考虑如下几点: 表得存储引擎为MyISAM是没有事

Spring学习8-Spring事务管理(AOP/声明式式事务管理)

一.基础知识普及 声明式事务的事务属性: 一:传播行为 二:隔离级别 三:只读提示 四:事务超时间隔 五:异常:指定除去RuntimeException其他回滚异常.  传播行为: 所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为. spring的事务传播规则: 传播行为 意义 PROPAGATION_REQUIRED 如果当前存在事务,则加入该事务:如果当前没有事务,则创建一个新的事务. PROPAGATION_REQUIR

Spring学习--用 ASpectJ 注解实现 AOP

用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ 切面之后 , Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 bean 创建代理. 在 ApectJ 注解中 , 切面只是一个带有 @Asject 注解的 Java 类. 通知是标注有某种注解的简单的 Java 方法. AspectJ 支持 5 种类型的通知注解: @Befo

spring学习笔记之——注解

spring注解可以很大的减少xml的配置,spring.xml文件的声明为: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context