文档章节

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
博文 1251
码字总数 256097
作品 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 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 隔离问题: 脏读:一个事务读到另一...

黑泽明军
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
SSM整合,个人总结和step

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

wzlhlhhh
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
10
0
ios多个target

1.建立3个target,分别为heroone,heroone test,heroone dev;分别为正式环境,test环境,dev环境 2.注意取消掉autocreate以防止名字不对,分别以Duplicate的方式建立另外两个scheme 3.创建...

HeroHY
今天
6
0
php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
昨天
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
昨天
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部