TUESDAY, 07 APRIL

Comprehensive transaction support is the most compelling reasons to use the Spring-Framework.

不得不选择Spring-Framework的原因在于其全面事务的支持。

Q1: What is transaction?

A1:transaction_事务:一步或几步数据操作序列组成的逻辑执行单元。特性:原子性、一致性、隔离性、持续性

事务的控制是保证应用程序底层数据完整性的重要手段。

11-1.Global transactions and Local transactions

  • Global transaction: enable you to work with multiple transaction resources;

The app server manages global transactions through the JTA, and you also need to use JNDI because a JTA UserTransaction needs to be sourced from JNDI.

So it could limit any potential reuser of app code.

总结:全局事务允许同时使用多个事务资源(数据库和进程),但复杂的依赖关系导致全局事务的使用限制了代码的复用性。

关键词:笨重,复杂

- Local transaction: resource-specific, more easier more disadvantages: code that manages transactions using a JDBC connection cannot run within a global JTA transaction; another downside is that local transaction are invasive to the programming model

总结:本地事务是基于特定资源进行执行逻辑的单元,更容易使用,没有复杂的依赖关系,但本地事务的缺点也很明显,单一性,无法使用多个事务资源,只适合于执行数据的本地且单一进程的事务,本地事务不涉及多个数据来源。

其次,本地事务更趋近于强侵入性的编程模型。

关键词:单一,侵入性

11-2.Spring-Framework's consistent programming model

  • Spring-Framework resolves the disadvantages of global and local transaction.

You Write your code once, and it can benefit from different transaction management strategies in different environments

You typically write little or no code related to transaction management

Don't depend on the Spring Framework transaction API or any other transaction API

- Declarative and programmatic transaction management.

总结:Spring-Framework提供的一致性编程模型能够解决上述两种事务的不足。(声明式事务+编程式事务)

1、一次编写,适应不同的事务管理策略,在不同的环境中能够运行

2、只需编写少许代码,或者根本不用编写代码就能实现事务管理

3、并不依赖与Spring-Framework事务API或者其他事务API

11-3.Spring-Framework transaction abstraction

Key: transaction strategy(事务策略)

Defined: org.springframework.transaction.PlatformTransactionManager interface

Manager:

-getTransaction(TransactionDefinition
definition)

return a TransactionStatus object,
depending on a TransactionDefinition
parameter

tips:

TransactionDefinition
interface:

  • Isolation:事务是否独立于其他事务;
  • Propagation:
  • Timeout:
    事务执行的时长限制,何时执行自动回滚(rollback)
  • Read-only
    status: 只允许用户使用代码读取数据,并不允许修改数据。Read-only事务是一个非常有用的选项,特别是在面对hibernate的时候。

-commit(TransactionStatus status)

-rollback(TransactionStatus
status)

tips:

Public interface TransactionStatus
extends SavepointManager{

Boolean isNewTransaction();

//是否是新建的事务

Boolean hasSavepoint();

//是否有逻辑点,可以将事务回退到这个点,而不是回退整个事务。

Void setRollbackOnly();

//将回滚事务的操作停留在方法级别,可以只回滚关键方法。

Boolean isRollbackOnly();

//是否只回滚部分

Void flush();

Boolean is Completed();

//事务是否完成

}

As we can see, this transaction
strategy is defined by an interface, it can be easily mocked or
stubbed as necessary. And it's not tie to a look up strategy such
as JNDI.

This PlatformTransactionManager
implementations is just defined like any other object or bean in
Spring's IOC container. This benefit makes Spring Framework
transactions a worthwhile abstraction even you work with JTA.

总结:事务管理策略的定义是基于一个普通的接口类实现的,而该接口类直接交由Spring的IOC容器管理。

无论你在Spring中使用哪一种事务管理策略,声明式 or 编程式, platformTransactionManager
的实现才是最重要的一步。

-JDBC Template:

1)定义dataSource

2)定义事务管理策略,需要声明dataSource的位置

-JTA
+ JNDI

定义的JTA事务管理策略并不需要知道dataSource的位置,因为JTA是全局事务管理。

-Hibernate

本地事务管理,Hibernate,需要告知sessionFactory的位置,而sessionFactory则是Hibernate对dataSource的管理方法。

JDBC与Hibernate的例子中也可使用JTA,并不需要提供dataSource位置。

11-4 Declarative Transaction
management

The Spring Framework's declarative
transaction management is similar to EJB CMT(Container Managed
Transaction) in that you can specify transaction behavior down to
individual method level.

总结:Spring-Framework的声明式事务管理可以将指定的事务提高到方法级别。即通过将一个或者几个方法声明为事务。

-Key
words: non-invasive, lightweight

-The
differences between EJB CMT and Spring-Framework's
declarative Transaction management

1)works in any environment,
which is not like EJB CMT tied to JTA(依赖性弱,对运行环境要求不高)

2)apply the Spring-Framework DTM
to any class(对对象的限制不强,而JTA在管理transaction的时候要求必须为EJB类)

3)customize transactional
behavior by using AOP(DTM可以通过AOP自定义事务内容,将自定义事务内容插入事务回滚中。)

4)Spring-Framework
不支持事务上下文远程调用的propagation属性???

-Rollback rules:
指定当抛出异常的时候回滚的方法与内容。可以用配置的方式指定回滚声明,并不需要用代码实现。一般情况下,通过调用TransactionStatus对象中的setRollbackOnly()方法实现回滚,但在使用Spring-Framework的大多数时候都直接指定回滚内容,例如MyApplicationException,这样一来,业务对象就不依赖于事务的基础结构,比如说,无需再引入Spring事务API或者其他Spring的API,独立性强。

-Understanding the Spring-Framework's declarative
transaction implementation

仅仅只是知道用@Transactional注解类,添加@EnableTransactionManagement用来注解配置是不够的。我们需要从原理上理解how
it works。

The
combination of AOP with transactional metadata yields an AOP proxy
that uses a TransactionInterceptor
in conjunction with an
appropriate platformTransactionManager(interface
class) implementation
arround method invocations.

通过AOP与事务元数据的结合,提供AOP代理,将TransactionInterceptor(事务拦截器,控制事务的第一步,获取事务)与适当的PlatformTransactionManager实现类共同实现在驱动事务。原理如下图:

事务管理器的配置内容:

标记1:定义管理事务的事务管理器,在下方代码有提到。

标记2:的配置内容确保了txAdvice定义的事务方案在合适的时间执行。

利用将pointcut和标记1种定义的txAdvice 关联起来。fooServiceOperation执行,txAdvice定义

的方案will be run。

实例(from Spring framework Reference
Document)

从日志文件的记录上我们能够很清楚的看到配置的事务管理器在事务管理上的作用。

翻译:Spring-Framework-Reference Document:11-Transaction Management的更多相关文章

  1. Spring Framework Reference,Documentation,spring英文文档.pdf 官方文档

    直接上链接:http://files.cnblogs.com/files/kongkaikai/spring-framework-reference.pdf 官网链接:http://docs.spri ...

  2. spring Transaction Management --官方

    原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12.  ...

  3. Spring Framework 4.3.22.RELEASE Reference文档目录

    <Spring Framework Reference Documentation 4.3.22.RELEASE> https://docs.spring.io/spring/docs/4 ...

  4. Spring Boot Reference Guide

    Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch,  ...

  5. Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览1-2.2

    Part I. Spring框架概览 The Spring Framework is a lightweight solution and a potential one-stop-shop for ...

  6. Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)

    简介 Spring.NET为事务管理提供了一个持久化抽象(consistent abstraction ),其优点如下: 为不同事务API,例如ADO.NET,Enterprise Services, ...

  7. Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览2.3

    2.3 Usage scenarios 使用场景 The building blocks described previously make Spring a logical choice in ma ...

  8. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

  9. Learn Spring Framework(continue update...)

    Part I. Overview of Spring Framework The Spring Framework is a lightweight(轻量级的) solution and a pote ...

  10. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->关于spring framework中的beans

    Spring framework中的beans 1.概述 bean其实就是各个类实例化后的对象,即objects spring framework的IOC容器所管理的基本单元就是bean spring ...

随机推荐

  1. Winform利用委托进行窗体间的传值

    在form1.cs中 1.委托的定义 //定义一个委托 public delegate void AddUsrEventHandler(object sender, AddUsrEventHandle ...

  2. java实现数据库分页

    /*** * 工具类 * @param pageIndex //页码 * @param pageSize//每页数据的条数 * @param rowCount//总的数据条数 * @return */ ...

  3. DRF的@action装饰器

    # 转自:http://www.cnblogs.com/zhzhlong/p/9325180.html 视图集中附加action的声明 from rest_framework.decorators i ...

  4. linux命令行任务管理

    今天看到了linux命令行的任务管理命令感觉很实用: 1.ctrl+z  将当前前台执行的任务放到后台并暂停 2.fg恢复上次放入后台的任务 这两个命令组合起来很实用,比如在linux命令行中写pyt ...

  5. 多路复用I/O模型epoll() 模型 代码实现

    epoll模型 int epoll_create(int maxevent) //创建一个epoll的句柄 然后maxevent表示监听的数目的大小int epoll_ctl(int epollfd, ...

  6. PHP定界符出现错误

    Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T ...

  7. mysql5.7 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    mysql5.7初次登录使用提示 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before ...

  8. 搭建owncloud私有云

    参考:教程1,教程2,教程3,教程4 硬件:raspi 3b+ 系统:UbuntuMate 步骤: 1.安装Apache2 sudo apt-get install apache2 完成后访问服务器地 ...

  9. NodeJs中使用jQuery?

    在NodeJs中使用jQuery? 有时候在项目中需要使用jq在node中,但是使用起来却不是那么友好,那么现在该怎么做?改写JQ插件?将JQ插件打包成npm包,再在项目中进行引用?显然这些相比较于难 ...

  10. jquery扩展插件,让demo元素也可以resize

    (function($, h, c) { var a = $([]), e = $.resize = $.extend($.resize, {}), i, k = "setTimeout&q ...