© 版权声明:本文为博主原创文章,转载请注明出处

1.什么是事务

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

2.事务特性(ACID)

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

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

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

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

3.Spring事务API

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

  - PlatformTransactionManager:事务管理器

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

  1)使用Spring JDBC或者iBatis进行数据持久化时使用DataSourceTransactionManager

  2)使用Hibernate进行数据持久化时使用HibernateTransactionManager

  3)使用JPA进行数据持久化时使用JpaTransactionManager

  4)使用Jdo进行数据持久化时使用JdoTransactionManager

  5)使用JTA进行数据持久化,在一个事务跨越多个资源时必须使用JtaTransactionManager

  - TransactionDefinition:事务定义信息(隔离、传播、超时、只读)

  不考虑隔离性可能出现的问题

  1)脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据回滚,则读到的数据是无效的

       eg:事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的

  2)不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据

          eg:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果

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

       eg:事务T1对一个表中的全部数据进行了修改。同时,事务T2向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,

          就好象发生了幻觉一样

  不可重复和幻读的区别:

    结果:

    1)不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现不一样了

    2)幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样

    控制:

    1)对于不可重复读, 只需要锁住满足条件的记录,就可避免

    2)对于幻读, 要对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),才可避免

  隔离级别

  - DEFAULT:使用后端数据库默认的隔离级别

  - READ_UNCOMMITTED:允许你读取还未提交的改变了的数据。可能导致脏读、幻读、不可重复读

  - READ_COMMITTED:允许在并发事务已经提交后读取。可防止脏读,但幻读和不可重复读仍可发生

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

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

  注:MySQL默认采用REPEATABLE_READ    ORACLE默认采用READ_COMMITTED

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

  - PROPAGATION_REQUIRED:支持当前事务,不存在就创建一个

  - PROPAGATION_SUPPORTS:支持当前事务,不存在就不使用事务

  - PROPAGATION_MANDATORY:支持当前事务,不存在就抛出异常

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

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

  - PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常

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

4.Spring的两种事务管理

  - 编程式事务管理

  1)实际应用中比较少用

  2)通过TransactionTemplate手动管理事务

  - 声明式事务管理

  1)推荐使用(代码侵入性最小)

  2)Spring的声明式事务是通过AOP实现的

参考:http://www.imooc.com/learn/478

     http://bbs.csdn.net/topics/120024254

Spring事务管理简介的更多相关文章

  1. Spring事务管理——其他的事务属性

    之前我们说过Spring事务管理中的事务的传播行为的属性.下面我们来说一下它的其他属性. 一.事务的隔离级别 1 .数据库事务并发问题.假设现在有两个事务:Transaction01和Transact ...

  2. Spring 事务管理案例

    事务管理简介   Spring 事务管理有两种方式:一种是编程式事务管理,即通过编写代码实现事物管理,包括定义事务的开始,程序正常执行后的事物提交,异常时进行的事务回滚.另一种是基于AOP技术实现的声 ...

  3. Spring---AOP注解开发&jdbc模板&Spring事务管理

    一.AOP注解开发 此处需要回忆一遍AOP的概念.简单的来说,AOP就是利用动态代理技术,做到不触动源代码但却扩展了功能.那么就需要一个被扩展的对象和一个“新的功能”,例如说给某类的saveUser方 ...

  4. Spring事务管理----------整合学习版

    作者:学无先后 达者为先 Spring提供了一流的事务管理.在Spring中可以支持声明式事务和编程式事务. 一  spring简介 1 Spring的事务       事务管理在应用程序中起着至关重 ...

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

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

  6. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  7. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  8. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  9. Spring事务管理器的应对

    Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...

随机推荐

  1. 图文详解前端CSS中的Grid布局,你真的可以5分钟掌握

    前言 网站的布局是一个网站设计的根本,CSS的Grid布局已经成为了未来网站布局的基本方式. 今天这篇文章我们通过图文,一起看看如何自己实现Grid布局方式. CSS 第一个Grid布局 首先我们看看 ...

  2. 洛谷 P1506 拯救oibh总部【DFS/Flood Fill】

    题目背景 oibh总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去 ...

  3. flow JavaScript 静态类型检查工具

    内置类型 flow 内置类型有 boolean, number, string, null, void, any, mixed, literal type. 其中 boolean, number, s ...

  4. 中国石油大学(华东)OJ题目的HTML爬取

    这几天刷华东OJ的题,写博客还要复制HTML的代码,感觉麻烦的一批,然后就去摸鱼写了个小爬虫.. 看一下运行效果吧- 输入详细的pid.cid或id即可爬取相应的html代码 一些注意要点: 关键的还 ...

  5. adb 查看android手机中应用的包名和安装位置

    1. 查看是否连接手机 adb devices 2. 进入指定的device的shell adb shell 或者 adb -s ********* shell 3. adb 查看所有安装的包 pm ...

  6. kong后台接口

    在nginx-kong.lua中,require('lapis').serve('kong.api'),先require文件/usr/local/share/lua/5.1/lapis/init.lu ...

  7. iPhone 通过UIRequiredDeviceCapabilities指定程序适用于哪些设备

    以前在itunes中查看某个应用时,会有说明信息,表明程序适用于ios 1.0,2.0,3.0什么的. 上周末将Key Manager上传到app store时,一直有个疑问,就是没有发现填写程序适用 ...

  8. Features (OCMock 2)

    This page describes the features present in OCMock 2.x, using the traditional syntax. All these feat ...

  9. 【mybatis】时间范围 处理时间格式问题 + 查询当天 本月 本年 + 按当天 当月 范围 查询 分组

    1.mybatis中查询时间范围处理: 例如2018-05-22 ~2018-05-23 则查出来的数据仅能查到2018-05-22的,查不到2018-05-23的数据! 为什么会这样? 明明时间字段 ...

  10. 单核时代,PHP之类多线程或者多进程的,是怎么处理并发的?是排队吗?

      答案是:的确就是排队.但是并不是一定要处理完请求1才能去处理请求2:实际上请求的处理过程中,有很多的时间是耗在IO等其他地方,这时可以切换去处理其他请求,把等待的时间可以充分利用起来,达到更高的吞 ...