Spring 事务Transaction
1.事务的属性
1.1 事务隔离IsolationLevel
1.2 事务传播PropagationBehavior
1.3 事务超时Timeout
1.4 只读状态ReadOnly
隔离级别、超时、只读状态都依赖于底层的数据库实现,Spring仅仅起了代理作用(MySQL的MyISAM引擎是无事务引擎,那么Spring是不可能带有事务管理功能的)。
事务传播行为是Spring框架所特有的。
2 使用Spring事务只需要了解PlatformTransactionManager、TransactionDefinition、TransactionStatus三个接口。
2.1 TransactionDefinition描述了事务的配置。
2.2 TransactionStatus描述当前事务的状态。
2.3 PlatformTransactionManager使用TransactionDefinition来配置事务,使用TransactionStatus控制事务,对外提供了对事务的操作。
3 事务传播行为详解(Spring定义了7种传播行为,3种最为常用的),事务传播行为发生在方法相互调用的时候(ServiceA.methodA调用ServiceB.methodB)。
3.1  PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    Spring只对public方法进行代理。目前,资源系统使用的默认事务传播行为就是PROPAGATION_REQUIRED。
3.2  PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
概念理解:PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行.
举例
问题:用一张工单woId,操作100个产品,进行链路配置(1个产品对于一条链路),成功配置链路的产品则提交,失败配置的链路则回滚。
分析:这说明100个产品是相互独立的,应该使用PROPAGATION_REQUIRES_NEW,每一个产品都是一个独立的事务。系统的默认行为已经不能满足当前需求,需要使用编程式事务管理。
方法:
for (int n = 0; n < 100; n++) {
    TransactionDefinition def = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    TransactionStatus status = transactionManager.getTransaction(def);
    try{
    //产品配链路的业务逻辑
    configLink();
    transactionManager.commit(status);
    }catch(Exception e){
    transactionManager.rollback(status);
    }
}//end for
这是自热而然的方法,但是却是错误的方法,在for循环中,循环开启事务,并未生效(不清楚是什么原因)!
将事务代码全部放入configLink()中即可。
for (int n = 0; n < 100; n++) {configLink();}
public void configLink(){
    TransactionDefinition def = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    TransactionStatus status = transactionManager.getTransaction(def);
    //产品配链路的业务逻辑
    transactionManager.commit(status);
}
3.3  PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
概念理解:PROPAGATION_NESTED 开始一个 "嵌套的" 事务,  它是已经存在事务的一个真正的子事务. 嵌套事务开始执行时,  它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 嵌套事务是外部事务的一部分, 通过外部的事务提交,才能引起内部事务的提交,嵌套的子事务不能单独提交。嵌套事务最有价值的地方, 它起到了分支执行的效果。
举例
问题:原有链路拆除方法抛出异常时,调用链路强制拆除方法。
方法:
try{
    oldMethodA();
}catch(Exception e){
    newMethodB();
}
这种方式解决不了问题,oldMethodA与newMethodB处于同一事务中,oldMethodA中的操作在newMethodB是可见的,产生了脏数据。
使用嵌套事务,将其改为:
TransactionDefinition def = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_NESTED);
try{
    oldMethodA();
}catch(Exception e){
    transactionManager.rollback(status);
    newMethodB();
}
另外,嵌套事务使用的是保存点,因此也可以使用status.createSavepoint()来替代。
4 声明式事务管理@Transactional
4.1 默认遇到throw new RuntimeException("..."),会回滚,需要捕获的throw new Exception("...");不会回滚。
4.2 注解的属性在org.springframework.transaction.annotation.Transactional中定义。
4.3 资源系统对所有*Service的public方法使用了事务代理,因此这些方法不能再次使用@Transactional注解,会发生重复注入的问题。

http://www.cnblogs.com/njtcy/p/4439092.html

Spring事务讲解示例(转)的更多相关文章

  1. Spring事务讲解示例

    Spring 事务Transaction1.事务的属性1.1 事务隔离IsolationLevel1.2 事务传播PropagationBehavior1.3 事务超时Timeout1.4 只读状态R ...

  2. Spring事务用法示例与实现原理

    关于Java中的事务,简单来说,就是为了保证数据完整性而存在的一种工具,其主要有四大特性:原子性,一致性,隔离性和持久性.对于Spring事务,其最终还是在数据库层面实现的,而Spring只是以一种比 ...

  3. Spring事务银行转账示例

    https://www.imooc.com/video/9331 声明式事务 @Transactiona() 编程式事务 非模板式(不使用TransactionTemplate) http://cai ...

  4. Spring事务事件监控

    前面我们讲到了Spring在进行事务逻辑织入的时候,无论是事务开始,提交或者回滚,都会触发相应的事务事件.本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理. ...

  5. Spring事务实现分析

    一.Spring声明式事务用法 1.在spring配置文件中配置事务管理器 <bean id="baseDataSource" class="com.alibaba ...

  6. 2018.11.12 Spring事务的实现和原理

    Spring事务用法示例与实现原理 关于事务,简单来说,就是为了保证数据完整性而存在的一种工具,其主要有四大特性:原子性.一致性.隔离性和持久性.对于Spring事务,其最终还是在数据库层面实现的,而 ...

  7. 【源码讲解】Spring事务是如何应用到你的业务场景中的?

    初衷 日常开发中经常用到@Transaction注解,那你知道它是怎么应用到你的业务代码中的吗?本篇文章将从以下两个方面阐述Spring事务实现原理: 解析并加载事务配置:本质上是解析xml文件将标签 ...

  8. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  9. spring事务传播行为讲解转载

    https://segmentfault.com/a/1190000013341344 前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是 ...

随机推荐

  1. C中程序的内存分配

    一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. ...

  2. 友情转发一则Erlang招聘广告

    新锐手游开发公司WalkYY,招聘Erlang游戏服务端开发工程师若干名,要求有半年以上Erlang游戏服务端开发经验,熟悉Erlang OTP和MySQL数据库.公司团队靠谱,发展空间大,有意者请发 ...

  3. 获取sina,baidu,google财经历史和实时股票数据接口

    实时股票数据接口 股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口1.http/javascript接口取数据1.1Sina股票 ...

  4. Redis slowlog

    和mongo的slowlog一样,redis中对于操作时间较长(默认为10秒)的命令也会记录下来,不过它将它们保存在redisServer结构中的slowlog这个链表中,新进来的log排在链表头部, ...

  5. 【linux驱动分析】之dm9000驱动分析(六):dm9000_init和dm9000_probe的实现

    一.dm9000_init 打印出驱动的版本,注冊dm9000_driver驱动,将驱动加入到总线上.运行match,假设匹配,将会运行probe函数. 1 static int __init 2 d ...

  6. Spring3.0官网文档学习笔记(一)

    Part 1 Spring框架概述 Spring是模块化的,在应用中仅仅须要引入你所须要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web ser ...

  7. Android 增量更新实例(Smart App Updates)

    原地址:http://my.oschina.net/liucundong/blog/160436 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 ...

  8. JavaScript 中的事件对象(读书笔记思维导图)

    在触发 DOM 上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对象中,会包含 ...

  9. VMware中linux与window目录共享

    在虚拟机下来实如今windows下共享一个目录: (前提已安装完毕vmtools:http://blog.csdn.net/pipisorry/article/details/21318931) 打开 ...

  10. 深入浅出Windows BATCH

    1.什么是Windows BATCH BATCH也就是批处理文件,有时简称为BAT,是Windows平台上的一种可运行脚本,与*nix(Linux和Unix)上的Shell脚本和其它的脚本(Perl, ...