一、事务定义:

  事务指逻辑上的一组操作,这组操作要么全部成功,要么全部失败.

  二、事务的特性:

  1. 原子性 - 指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  2. 一致性 - 指事务前后的数据的完整性必须保持一致。

  3. 隔离性 - 指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要互相隔离。

  4. 持久性 - 指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。

  三、Spring事务管理高层抽象主要包括三个接口:

  (1)PlatformTransactionManager:事务管理器

  (2)TransactionDefinition:事务定义信息(事务隔离级别、传播行为,超时,只读),TransactionDefinition的实现类保存了对事务管理的配置信息,该类的实例被Manager读取用来创建执行事务管理的对象;

  (3)TransactionStatus:事务具体运行状态

  四、Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现

  1. org.springframework.jdbc.datasource.DataSourceTransactionManager —— 在使用Spring JDBC或iBatis进行持久化数据时使用

  2. org.springframework.orm.hibernate3.HibernateTransactionManager —— 在使用Hibernate3.0版本进行持久化数据时使用

  3. org.springframework.orm.jpa.JpaTransactionManager —— 在使用JPA进行持久化时使用

  4. org.springframework.jdo.JdoTransactionManager —— 当持久化机制是jdo时使用

  5. org.springframework.transaction.jta.JtaTransactionManager —— 使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

  事务如果不考虑隔离性,会引发脏读、不可重复读、幻读等问题

  脏读:

  一个事务读取到另一个事务还没有提交的数据,如果这些数据被回滚,则读取到的数据是无效的。

  不可重复读:

  在同一个事务中,多次读取同一数据,读到了另一个事务已经更新的数据,导致返回的结果有所不同。

  虚读,幻读:

  一个事务读取几行记录后,另一个事务插入一些记录,幻读就发生了,在后来的查询中,第一个事务就会发现原来没有的记录。

  五、Spring事务的隔离级别

  1. DEFAULT : 使用后端数据库默认的隔离级别(spring中的选择项)

  2. READ_UNCOMMITTED : 允许你读取还没有提交的改变了的数据,可能会导致脏读、幻读、不可重复读

  3. READ_COMMITTED : 允许在并发事务已经提交后读取数据,可以防止脏读,但幻读和不可重复读仍可能发生

  4. REPEATABLE_READ : 对相同字段的多次读取是一致的,除非数据被事务本身改变。可以防止脏读、不可重复读,但是幻读仍可能发生

  5. SERIALIZABLE : 最高隔离级别,它完全服从ACID的隔离级别,确保不发生脏读、幻读、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的

  MySql默认的事务隔离级别为REPEATABLE_READ

  Oracle默认的事务隔离级别为READ_COMMITTED

  六、Spring事务的传播行为

  事务传播行为要解决的问题:解决业务层方法之间相互调用的问题

  业务层中添加了事务的多个方法被一起调用时,如何处理各方法间事务的关系的问题,具体来说是事务如何传递的问题。

  事务传播行为级别

  1. PROPAGATION_REQUIRED : 支持当前事务,如果不存在就新建一个

  2. PROPAGATION_SUPPORTS : 支持当前事务,如果不存在,就不使用事务

  3. PROPAGATION_MANDATORY : 支持当前事务,如果不存在,抛出异常

  4. PROPAGATION_REQUIRES_NEW : 如果有事务存在,挂起当前事务,创建一个新的事务

  5. PROPAGATION_NOT_SUPPORTED : 以非事务方式运行,如果有事务存在,挂起当前事务

  6. PROPAGATION_NEVER : 以非事务运行,如果有事务存在,抛出异常

  7. PROPAGATION_NESTED : 如果当前事务存在,则嵌套事务执行

  (1). 支持当前事务,即事务存在则加入当前事务,如果事务不存在分别有新建一个事务,不使用事务,抛出异常三种行为;

  (2). 不支持当前事务,即独立运行事务,如果事务存在分别有新建一个事务,不使用事务,抛出异常三种行为;

  (3). 如果当前事务存在,则将自身的事务作为当前事务的子事务运行,在运行子事务时,当前事务记录一个保存点,子事务不报错则和当前事务一起提交或回滚,子事务报错则根据自定义配置让当前事务回滚到保存点或起始点;

  TransactionStatus接口用来记录事务的状态 ,该接口定义了一组方法,用来获取或判断事务的相应状态信息.

  平台事务管理器(PlatformTransactionManager)会根据TransactionDefinition中定义的事务信息(包括隔离级别、传播行为)来进行事务的管理,在管理的过程中事务可能产生了保存点或事务是新的事务等情况,那么这些信息都会记录在TransactionStatus的对象中.

  七、Spring将事务管理分成了两类:

  (1)编程式事务管理

  手动编写代码进行事务管理.(很少使用)

  (2)声明式事务管理:

  基于TransactionProxyFactoryBean的方式.(很少使用)

  需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强.

  基于AspectJ的XML方式.(经常使用)

  一旦配置好之后,类上不需要添加任何东西

  基于注解方式.(经常使用)

  配置简单,需要在业务层上添加一个@Transactional的注解.

  

简说Spring事务的更多相关文章

  1. mybatis+spring事务

    http://www.mybatis.org/spring/zh/transactions.html 第四章 事务 一个使用 MyBatis-Spring 的主要原因是它允许 MyBatis 参与到 ...

  2. Spring事务管理总结

    本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 本文对应慕课网上课程Spring事务管理,详情可查看:点我 1: 概 ...

  3. spring事务探索

    spring自建事务管理模块.而且这个事务管理是一个抽象设计,可以应用到很多场合,包括普通的DataSource,jta,jms和hibernate上.  要正确使用spring的事务,首先需要了解s ...

  4. 透彻理解Spring事务设计思想之手写实现

    前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),D ...

  5. 理解 Spring 事务原理

    转载:https://www.jianshu.com/p/4312162b1458 一.事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事 ...

  6. Spring事务管理的一些注意点

    在<Spring Boot事务管理(下)>中,已经介绍了如果在 protected.private 或者默认可见性的方法上使用@Transactional,事务将是摆设,也不会抛出任何异常 ...

  7. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  8. spring事务概念理解

    1.数据并发问题 脏读 A事务读取B事务尚未提交的更新数据,并在此数据的基础上操作.如果B事务回滚,则A事务读取的数据就是错误的.即读取了脏数据或者错误数据. 不可重复组 A事务先后读取了B事务提交[ ...

  9. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

随机推荐

  1. java调用存储过程mysql

    在java中调用带返回值的存储过程的实现 直接上代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `t ...

  2. MySQL实现SQL Server排名函数

    最近在MySQL中遇到分组排序查询时,突然发现MySQL中没有row_number() over(partition by colname)这样的分组排序.并且由于MySQL中没有类似于SQL Ser ...

  3. LeetCode-MinimumDepthOfBinaryTree

    题目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the ...

  4. GCC编译器ABI

    ABI与EABI 1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口. ABI允许编译好的目 ...

  5. Trove系列(八)——Trove的配置管理相关的功能介绍

    概述MySQL 配置管理功能允许Trove 用户重载由Trove服务的操作者提供的缺省MySQL配置环境.这是通过影响MySQL 的includedir 命令来实现的.这些MySQL 的include ...

  6. ArcGIS 10——地理数据库管理GIS数据

    写本文的最初意向是当前正在进行的项目中有实现ESRI版本化数据管理的功能模块,碰到一些棘手的问题,几经周折还是决定系统学习ArcGIS10的帮助文档.(文章摘抄的比较多) 地理数据库是用于保存数据集集 ...

  7. 20154312 曾林 Exp3 免杀原理与实践

    20154312 曾林 0.写在前面 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找到,也就是 ...

  8. emoj表情过滤

    用法:  isEmojiCharacter(input_value)   //  提交时候校验.true:emoj表情   undefined:无   if(isEmojiCharacter(val) ...

  9. linux基础命令---tr

    tr 删除或者更改文件中的字符串,这个指令一般需要两个字符集. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法       ...

  10. Java lambda 表达式

    其实是试验一下markdown... 原: 只有一个抽象方法的接口称为函数式接口(functional interface). 当需要实现了这种接口的类的对象的时候,就可以提供一个lambda表达式. ...