文档章节

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

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

事务就是一组数据库操作,但这组操作是具有原子性的(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零_度
粉丝 67
博文 1245
码字总数 252866
作品 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
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 Transaction + MyBatis SqlSession事务管理机制研究学习

原文地址:Spring Transaction + MyBatis SqlSession事务管理机制研究学习 线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是...

Realfighter
2015/01/10
0
1
SSM整合,个人总结和step

我最近才整合完SSM。 前段时间,分开学习了这三个框架,都是看某黄埔军校的视频,整合的部分没看视频,想自己做。 但是有一些部分自己没有能完成,主要是如何从spring容器里取出Application...

wzlhlhhh
05/11
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
05/28
0
0
springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits [TOC] 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,...

brianway
2016/03/30
1K
2
spring第三天SSH整合笔记

spring事务管理 * Spring事务管理高层抽象主要包括3个接口 1)PlatformTransactionManager 事务管理器 ,用于管理事务 2)TransactionDefinition 事务定义信息(隔离、传播、超时、只读)---静...

dh_
2014/04/22
0
0
【小马哥】Spring Boot系列讲座

这里为大家推荐一个不错的Spring Boot系列讲座,讲师介绍如下: 小马哥,阿里巴巴技术专家,从事十余年Java EE 开发,国内微服务技术讲师。目前主要负责微服务技术推广、架构设计、基础设施、...

杜琪
03/02
0
0
关于MyBatis sqlSession的一点整理

原文地址:关于MyBatis sqlSession的一点整理 工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些...

Realfighter
2015/01/04
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部