文档章节

Spring学习笔记(十七)----Spring中的事务

Zero零_度
 Zero零_度
发布于 2015/04/08 14:52
字数 1349
阅读 64
收藏 2

事务就是一组数据库操作,但这组操作是具有原子性的(atomic)。所谓原子操作,即这组数据库操作要么就都执行成功,要么就一个也没执行。当有一些操作成功了(“成功”指数据库里的数据已更新或提交),但中间出现异常,后边的也就无法执行时,事务要回滚,即恢复到什么也没执行以前的状态。

   举个比较常见的例子,一位顾客要进行银行转帐,把100元从A帐户转到B帐户,一般的过程是把A帐户的总额减去100,B帐户的总额加上100(只考虑最简单情况)。当在A帐户总额减去100后出现异常情况,使得无法再对B帐户进行操作。如果没使用事务,那么这位顾客就损失了100元,但如果使用了事务,那么出现异常后,事务回滚,使得A帐户总额恢复到减去100以前的金额。虽然使用事务并没有达到顾客转帐的目的,但避免了出现异常情况时顾客的损失。

事务就相当于我们做一件事情(这件事由许多小的步骤组成),要么我们就把这件事情完完整整地做成功,要么我们就一点也不要做。不能做到半截撂摊子不干了。

 回到Spring来,Spring的Dao框架对事务提供了强大的支持。它包括有两种事物管理,即:

  • 编程式事物管理(programmatic tansaction management)

  • 声明式事物管理(Declarative tansaction management)

  所谓编程式事物管理,就是把事物管理以代码的形式编写到你的应用中要使用事物管理的地方,灵活性较强。而声明式事物管理是以配置文件的形式在xml文件中定义,好处是不具有代码入侵性,当不需要事物管理时,可以直接修改配置文件,而不用修改代码。以后会介绍这两种事物管理。

  在Spring中,主要涉及以下几种事物属性:

1. 传播行为(propagation behavior)

  它是对事物的起始,暂停,终止时刻的定义,主要有以下几种

 参数  含义
 PROPAGATION_REQUIRED  如果存在事物的话,就继续这个事物,如果不存在,新建一个事物。
 PROPAGATION_SUPPORTS  如果存在事物的话,就继续这个事物,如果不存在,就以非事务的方式进行。
 PROPAGATION_MANDATORY  必须在现存事物中执行,否则抛出异常。
 PROPAGATION_REQUIRES_NEW  建立一个新事物,如果现存一个事物,则暂停它。
 PROPAGATION_NOT_SUPPORTED  不再事务中执行,如果现存事物,则暂停它。
 PROPAGATION_NEVER  不再事务中执行,如果现存事物,则抛出异常。
 PROPAGATION_NESTED  在一个嵌入的事物中执行,否则同PROPAGATION_REQUIRED

上述参数是在org.springframework.transaction.TransactionDefinition接口中定义的(类型是public static final,值从0到6)。上述参数中最常用的是PROPAGATION_REQUIRED

2. 隔离等级(isolation level)

  在一个应用应用程序中,可能有多个事务在运行,这时就会产生一些问题。

  • dirty read

    一个事物更新了数据库中的某些数据,另一个事物读取了这些数据,这时前一个事物由于某些原因回滚了,那么第二个事物读取的数据就是“脏数据”。

  • non-repeatable read

   一个事物需要两次查询同一数据,但两次查询中间可能有另外一个事物更改了这个数据,导致前一个事物两次读出的数据不一致。

  • phantom read

   一个事物两次查询同一个表,但两次查询中间可能有另外一个事物又向这个表中插入了一些新数据,导致前一个事物的两次查询不一致。

   为了解决以上问题,Spring的事物管理定义了一些隔离级别,所谓“隔离”,即对数据的锁定。

 参数  含义
 ISOLATION_DEFAULT  使用数据库默认的隔离级别
 ISOLATION_READ_UNCOMMITTED  容许事物读取其他并行事物还未提交的数据。这种级别会出现上面三种情况。
 ISOLATION_READ_COMMITTED  容许事物读取其他并行事物已经提交(commit)的数据,可防止dirty read
 ISOLATION_REPEATABLE_READ

 这种级别会可以防止上面三种情况发生。

 ISOLATION_SERIALIZABLE  使用事物锁,锁定相应数据,可以防止上面三种情况发生,但效率比较低。

上述参数也是在org.springframework.transaction.TransactionDefinition接口中定义的(类型是public static final,值为-1,1,2,4,8)。上述参数中最常用的是ISOLATION_DEFAULT

3. read only

   应用这项属性时,底层的数据库可以对读取进行最优化,但要配合PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW或PROPAGATION_NESTED使用,即只能在事物中使用。

4. timeout

   在多事物并行情况下,为了保证正确性,有些事物的操作会有延迟,甚至死锁。设置事物超时时间,可以避免事物的长时间等待。设置事物超时时间也要配合PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW或PROPAGATION_NESTED使用。

以上的四种属性及其相应方法都定义在org.springframework.transaction.TransactionDefinition接口及其实现类(如org.springframework.transaction.support.DefaultTransactionDefinition)里。

本文转载自:http://blog.sina.com.cn/s/blog_4b86f2ee0100077z.html

共有 人打赏支持
Zero零_度
粉丝 69
博文 1253
码字总数 256597
作品 0
程序员
私信 提问
springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建

springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建) 标签: springmvc mybatis [TOC] 本文主要展示如何在intellij IDEA中通过maven构建springmvc+mybatis框架的开发环境。 需求...

brianway
2016/03/10
432
0
day35_Spring学习笔记_03

一、事务管理 1.1、回顾事务 事务:一组业务操作ABCD,要么全部成功,要么全部不成功。 特性:ACID 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 隔离问题: 脏读:一个事务读到另一...

黑泽明军
2018/08/08
0
0
springmvc学习笔记(8)-springmvc整合mybatis之service

springmvc学习笔记(8)-springmvc整合mybatis之service 标签: springmvc mybatis [TOC] 本文记录如何整合service,包括定义spring接口,在spring容器配置service以及事务控制。让spring管理s...

brianway
2016/03/11
183
0
SpringMVC 中的Controller返回JSON数据

SpringMVC中的Controller返回JSON问题 ①配置JSON解析器 ②使用注解@ResponseBody返回的是json,没有使用该注解,则会进行页面跳转。 方案一

IamOkay
2014/11/21
0
0
Spring Boot学习笔记

多模块开发 [SpringBoot学习]-IDEA创建Gradle多Module结构的SpringBoot项目 RabbitMQ RabbitMQ 安装 linux安装RabbitMQ详细教程 Ubuntu 16.04 RabbitMq 安装与运行(安装篇) ubantu安装...

OSC_fly
2018/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
7
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部