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

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. MVC5 WebAPI 跨域处理

    问题描述: 在使用ASP.NET的MVC5进行WebAPI开发的时候,在跨域的情况下会报跨域的错, No 'Access-Control-Allow-Origin' header is present ...

  2. 洛谷 P1739 表达式括号匹配【STL/stack/模拟】

    题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返 ...

  3. sqldeveloper 英文设置

    在软件ide\bin目录下找到sqldeveloper.conf或ide.conf,加入 C:\Program Files (x86)\sqldeveloper\ide\bin AddVMOption ...

  4. ELK之收集日志到mysql数据库

    写入数据库的目的是持久化保存重要数据,比如状态码.客户端浏览器版本等,用于后期按月做数据统计等. 环境准备 linux-elk1:10.0.0.22,Kibana ES Logstash Nginx ...

  5. POJ 3057 Evacuation(二分图匹配+BFS)

    [题目链接] http://poj.org/problem?id=3057 [题目大意] 给出一个迷宫,D表示门,.表示人,X表示不可通行, 每个门每时间单位只允许一个人通过, 每个人移动一格的为一时 ...

  6. Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串:    String stringName ...

  7. JavaScript传递变量:值传递?引用传递?

    今天在看 seajs-2.2.1/src/util-events.js源码,里面有段代码不是很理解: var events = data.events = {} // Bind event seajs ...

  8. 字母数字、字母、汉字验证码 (java)

    原文:http://blog.csdn.net/qh_java/article/details/49854477 一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com ...

  9. 在eclipse上部署openfire 3.9.1源码,並配置openfire

    参考文章:https://my.oschina.net/u/1409622/blog/205603 在网上找了很久部署openfire源码的文章,由于我使用的是最新的3.9.1源码,试了很多种部署方法 ...

  10. python开发微信支付学习记录(转)

    前言 微信支付是由微信及财付通联合推出的移动支付创新产品.如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑. 要想开发顺利进行,首先要 ...