1. spring 事务管理抽象

spring 的事务策略机制的核心就是 org.springframework.transaction.PlatformTransactionManager 接口。

public interface PlatformTransactionManager {

    TransactionStatus getTransaction(
TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException;
}

PlatformTransactionManager 的方法运行出错时,都会抛出 TransactionException 异常,而这个异常几乎都是致命的,不可修复的。

getTransaction(..) 方法会根据对 TransactionDefinition 对象的处理结果返回一个 TransactionStatus 对象。 TransactionStatus 对象则表示一个事务的状态,表示该事务是否是一个新的事务,是否 commit 或 rollback 等。

public interface TransactionStatus extends SavepointManager {

    /**
* 是新的事务还是已存在的事务
*/
boolean isNewTransaction(); /**
* 是否有 savePoint*/
boolean hasSavepoint(); /**
* Set the transaction rollback-only. */
void setRollbackOnly(); /**
* 该事务是否已标记 rollback-only
*/
boolean isRollbackOnly(); /**
* Flush the underlying session to the datastore, if applicable:
* for example, all affected Hibernate/JPA sessions.
*/
void flush(); /**
* Return whether this transaction is completed, that is,
* whether it has already been committed or rolled back.*/
boolean isCompleted(); }

TransactionDefinition 接口则定义了下面几个属性

  • Isolation 隔离性级别
  • Propagation 传播属性:在事务上下文存在或者不存在时,可以指定方法的 tansaction 行为(新创建,使用已有的还是抛出异常)
  • Timeout: 超时时间
    • 时间单位 s
    • 表示在该时间内如果函数还没有执行完成,就会 rollback
  • Read-only status:  当代码中只是读取数据,而不修改数据时,可以使用该属性。

在和 mybatis 配合时,一般会使用 DataSourceTransactionManager, 它们的继承关系如下:

下面就以 spring-mybatis 给出配置事务的实例

1. 定义 DataSource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="${jdbc.initialSize}"></property>
<property name="maxActive" value="${jdbc.maxActive}"></property>
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
<property name="minIdle" value="${jdbc.minIdle}"></property>
<property name="maxWait" value="${jdbc.maxWait}"></property>
</bean>

2. 定义 DataSourceTransactionManager bean, 此时需要引用前面配置的 DataSource Bean

    <!-- 声明事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

3. 如果是使用基于注解的 spring 声明式事务管理, 需要如下配置

<tx:annotation-driven transaction-manager="transactionManager"/>

2. 声明式事务管理

2.1 对声明式事务管理机制的理解

spring 声明式事务管理是使用 AOP 代理实现的, transaction advice 事务通知是由元数据(注解或者 XML)驱动的。(待完善。。。)

2.2 @Transactional 注解

在上节最后我们已经说明,要使用基于注解的 spring 声明式事务,需要在 xml 中使用 <tx:annotation 配置。

<tx:annotation-driven transaction-manager="transactionManager"/>

<tx:annotation-driven 配置

XML 属性 默认值 描述
transaction-manager
transactionManager
如果声明的transaction manager 名字不是

transactionManager才需要配置
mode proxy 有 proxy, aspectj 两种模式可选
proxy-target-class false

只对 proxy 模式有效。是基于接口的还是基于类的代理被创建。

true,那么基于类的代理将起作用(这时需要cglib库)

false,使用标准的JDK 基于接口的代理理

order Ordered.LOWEST_PRECEDENCE

Defines the order of the transaction advice that is applied

to beans annotated with @Transactional.

@Transactional 配置

@Transactional 既可以注解在 class 上,也可以注解在 method 上。

有下面几点需要注意

  • 尽量注解在具体实现类中(大部分情况是 service 实现类),注解在接口上也可以,但还需要其他的配置才能生效,此处不会讲述。
  • 在注解到 method 上时,该 method 需要是 public 修饰符修饰,在 proxy 默认模式下,注解在 package或者 private 方法上不会报错,但也不会生效。

参考链接: https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-multiple-tx-mgrs-with-attransactional

spring 事务管理机制的更多相关文章

  1. Spring事务管理机制的实现原理-动态代理

    之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...

  2. Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制

    Spring入门6事务管理2 基于Annotation方式的声明式事务管理机制 201311.27 代码下载 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 前言 ...

  3. Spring入门5.事务管理机制

    Spring入门5.事务管理机制 20131126 代码下载 : 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 回顾之前的知识,Spring 最为核心的两个部分 ...

  4. Spring 框架基础(05):事务管理机制,和实现方式

    本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用jav ...

  5. Spring总结九:事务管理机制

    何为事务 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL ...

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

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

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

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

  8. Spring事务管理器的应对

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

  9. Spring事务管理(转)

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

随机推荐

  1. 【BZOJ2084】【洛谷P3501】[POI2010]ANT-Antisymmetry(Manache算法)

    题意描述 原题: 一句话描述:对于一个0/1序列,求出其中异或意义下回文的子串数量. 题解 我们可以看出,这个其实是一个对于异或意义下的回文子串数量的统计,什么是异或意义下呢?平常,我们对回文的定义是 ...

  2. 学习笔记|Java 教程|菜鸟教程

    一.Java 教程 1.Java 教程 Java 在线工具 JDK 1.6 在线中文手册 我的第一个 JAVA 程序 创建文件 HelloWorld.java(文件名需与类名一致), 代码如下: pu ...

  3. 【FAQ】调用接口序列化问题

    问题: Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException:Can not ...

  4. Linux 中排除掉筛选的文件

    以下命令以网站目录www为例做介绍,有时候更新网站的时候需要保留比如图片目录,或者其他目录就需要这样的操作 实例一: 删除文件夹内所有文件只保留一个文件命令 [root@linuxzgf www]# ...

  5. React Native vs. Cordova.

    简评:跨平台开发五彩斑斓,本文作者简单介绍 RN 和 Cordova 的两种不同终端跨平台流程,从与原生开发联系中分析其利弊. 什么是原生(Native)? 原生是一个相对概念.其实软件开发最后意义指 ...

  6. Swift 函数提前返回

    简评:函数提前返回主要的好处是:将每个错误处理进行分离,审查代码时不需要考虑多种复杂异常,我们可以吧注意力集中在也业务逻辑中,调试代码时可以直接在异常中打断点. 提前返回 首先来看一下需要改进的代码示 ...

  7. mongodb 两台互为主从

    主机A [root@mysql_master zhxf]# cat docker-compose.yml version: '3' services: mongo_rs1: image: mongo: ...

  8. 配置 CentOS 7 安装位置

    红框里是CentOS 7安装程序检测到的硬盘,选择你想把系统安装到哪个硬盘当中. 点击 Add disk 按钮可以添加指定的附加设备或者网络设备(通过ISCSI.FCoE等方式添加硬盘) 此处设置分区 ...

  9. Groovy 反序列化漏洞分析(CVE-2015-3253)

    0x00 前言   Java反序列化的漏洞爆发很久了,此前一直想学习一下.无奈Java体系太过于复杂,单是了解就花了我很久的时间,再加上懒,就一直拖着,今天恰好有空,参考@iswin大佬两年前的分析, ...

  10. 【App测试】:Monkey测试App稳定性

    一,前提搭建android studio的环境中: 二,CMD进入到AndroidSDK\platform-tools路径下:输入adb shell 这个提示就是表示手机未连接 三.连接安卓手机,手机 ...