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

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

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

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

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

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

Spring事务执行机制:

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

  2.@Transactional:默认情况下遇见RuntimeException类型的异常会执行回滚,Exception类型的异常不执行回滚。

  3.@Transactional(rollbackFor=Exception.class) :指定Exception类型的异常进行回滚。

  4.@Transactional(noRollbackFor=Exception.class):指定RuntimeException类型不进行回滚。

Spring事务传播行为:

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

  2.@Transactional(propagation=Propagation.PROPAGATION_SUPPORTS) :当前没有事务,则以非事务方式执行,如果有事务则以事务方式执行。

  3.@Transactional(propagation=Propagation.PROPAGATION_MANDATORY) :使用当前的事务,如果当前没有事务,就抛出异常。

  4.@Transactional(propagation=Propagation.PROPAGATION_REQUIRES_NEW) :新建事务,如果当前存在事务,把当前事务挂起。

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

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

  7.@Transactional(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

  

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

  1. Spring学习8-Spring事务管理

      http://blog.sina.com.cn/s/blog_7ffb8dd501014e0f.html   Spring学习8-Spring事务管理(注解式声明事务管理) 标签: spring注 ...

  2. 五(一)、spring 声明式事务注解配置

    一.事务概述: 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用:比如 用户购买图书:购买动作之前需要确认 ①图书的数量是否足够:②用户账号余额是否足够 ...

  3. 《四 spring源码》spring的事务注解@Transactional 原理分析

    先了解什么是注解 注解 Jdk1.5新增新技术,注解.很多框架为了简化代码,都会提供有些注解.可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件. 注解不会也不能影 ...

  4. 为什么阿里规定需要在事务注解@Transactional中指定rollbackFor?

    作者:Mint6 来源:http://39sd.cn/53D5D Java阿里巴巴规范提示:方法[edit]需要在Transactional注解指定rollbackFor或者在方法中显示的rollba ...

  5. SpringBoot事务注解@Transactional

    SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作. 1. 事务说明 在Spring中,事务有两种实现方式,分别是编程式事务管理 ...

  6. Spring 学习7 -事务

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  7. Spring学习_day03_事务

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! Spring_day03 一.事务 1.1 事务 事务 ...

  8. Springboot 事务注解--- @Transactional

    spring boot @Transactional事物处理    spring boot 添加事物使用 @Transactional注解 简单使用 在启动类上方添加 @EnableTransacti ...

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

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

随机推荐

  1. [转]如何把嵌套的python list转成一个一维的python list?

    import itertools a = [[1,2,3],[4,5,6], [7], [8,9]] out = list(itertools.chain.from_iterable(a))

  2. A - 装箱问题

    Problem Description 一个工厂生产的产品形状都是长方体,高度都是h,主要有1*1,2*2,3*3,4*4,5*5,6*6等6种.这些产品在邮寄时被包装在一个6*6*h的长方体包裹中. ...

  3. Spring_mvc的搭建以及实现

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...

  4. 多元线性回归(pandas/scikit-learn)

    import pandas as pd from sklearn.cross_validation import train_test_split from sklearn.linear_model ...

  5. Eclipse项目类型转换

    例如,将一个普通java项目改为动态Web项目: 在eclipse的项目上点右键,刷新项目. 在项目上点右键,进入属性(properties) 在左侧列表项目中点击选择“Project Facets” ...

  6. hdu 4602 递推关系矩阵快速幂模

    Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. UPC 2223: A-Number and B-Number(数位DP+二分)

    积累点: 1: (l&r)+((l^r)>>) == (l+r)/2 2: 注意判断现在是否有限制.当枚举下一个量时,是(isQuery && j==end),不要 ...

  8. TensorFlow——tensorflow指定CPU与GPU运算

    1.指定GPU运算 如果安装的是GPU版本,在运行的过程中TensorFlow能够自动检测.如果检测到GPU,TensorFlow会尽可能的利用找到的第一个GPU来执行操作. 如果机器上有超过一个可用 ...

  9. 咦?Oracle归档文件存哪了?

    实验环境:RHEL 5.4 + Oracle 11.2.0.3 现象:日志切换后没找到归档日志目录. 1.查看归档日志路径 2.日志切换后并未找到归档目录 3.创建归档目录后再次观察 引申知识 1.查 ...

  10. linux source filename

    简单来说:source filename即把filename文件里的命令(命令集脚本文件)执行一遍,相当于在shell里逐个执行单条命令