何为事务

  事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

  简单来说就是一组通过程序操作数据库的操作,要么全部成功,要么全部失败。

事务的ACID四大特性:

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

Spring事务管理的三个高层接口:

1,PlatformTransactionManager 平台相关事务管理器

  TransactionManager是整个spring事务管理核心对象,提供管理事务相关方法

项目开发时,使用不同持久层技术,就需要使用spring提供不同事务管理器

  JDBC编程 --- 通过Connection进行事务管理

    开启事务 conn.setAutoCommit(false);

    提交事务 conn.commit();

    回滚事务 conn.rollback();、 conn.rollback(SavePoint );

Spring 提供 DataSourceTransactionManager 针对Connection进行事务管理

Spring 提供 HibernateTransactionManager 针对 session进行事务管理

2,TransactionDefinition 事务定义信息 (在使用spring管理事务,对事务管理配置信息 )

  TransactionDefinition 主要指 spring管理事务过程中,配置如何对事务进行管理

  (隔离级别、传播行为、超时时间、 是否只读)

get Name 获取事务名称       getIsolationLevel 获取事务隔离级别

脏读:一个事务读取另一个事务 未提交的数据 ---- 非常严重安全问题 

不可重复读:一个事务读取另一个事务已经提交数据,先后读取两次,结果不一样(另一个事务进行update操作)

幻读:一个事务中先后读取两次,发现数据记录条数不一样(另一个事务进行insert操作 )

数据库为了解决 隔离性引发几种问题,提供四种隔离级别

  read uncommitted 引发所有隔离问题、

  read committed 阻止脏读发生、发生不可重复读和幻读、

  repeatable read 阻止脏读、不可重复读发生,可能发生幻读、

  serializable 阻止所有隔离问题

不是所有数据库都支持四种隔离级别, oracle只支持 read committed、serializable ; mysql支持所有隔离级别

DEFAULT 代表默认数据库隔离级别,oracle 默认级别 read committed、 mysql 默认级别 repeatable read

getPropagationBehavior 获取事务的传播行为

什么是传播行为?

  和隔离级别不同,不是数据库提供问题解决方案,而是spring针对实际开发中具体事务问题,引入事务解决方案,解决两个事务互相调用的问题 !

Spring为了解决上面的问题,提供七种传播行为

REQUIRED、SUPPORTS、MANDATORY:支持当前事务 (删除用户、删除订单)  操作同一事务

REQUIRES_NEW、NOT_SUPPORTED、NEVER:不支持当前事务 (ATM取钱、打印凭条)  操作不同事务

NESTED 嵌套事务,只对DataSourceTransactionManager 有效,底层原理SavePoint   一个事务,允许回滚到事务中的某个保存的点,然后继续执行

3,TransactionStatus 事务运行状态

  指事务运行过程中,某个时间点事务状态信息

用户想使用spring进行事务管理 ,对事务管理进行配置(TransactionDefinition),选用针对持久层技术事务管理器 TransactionManager, TransactionManager根据TransactionDefinition 进行事务管理,在事务管理过程中通过 TransactionStatus获取当时事务状态 。

Spring事务管理的两种方式:

1、 编程式事务管理,在需要事务管理目标代码中,添加事务管理的代码 (有代码侵入事务管理方式 ,现在使用的非常少 )

在spring配置TransactionManager ,将transactionManager对象注入到 TransactionTemplate 对象中,将transactionTemplate 注入到目标程序中

transactionTemplate.execute(new TransactionCallbackWithoutResult(){
doInTransaction(){
// 将需要事务管理代码,加在这里
}
});

如果方法没有异常,事务提交,如果方法发生异常,事务回滚

2、 声明式事务管理,底层使用AOP的环绕通知,没有任何代码侵入,现在开发中推荐使用 。

-----------------------------------------------------------下一篇写简单案例

Spring总结九:事务管理机制的更多相关文章

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

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

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

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

  3. spring 事务管理机制

    1. spring 事务管理抽象 spring 的事务策略机制的核心就是 org.springframework.transaction.PlatformTransactionManager 接口. ...

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

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

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

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

  6. [转]Spring3核心技术之事务管理机制

    原文地址:http://chouyi.iteye.com/blog/1675199 Spring对事务的解决办法其实分为2种:编程式实现事务,AOP配置声明式解决方案. http://jinnians ...

  7. Spring学习8-Spring事务管理(编程式事务管理)

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

  8. Spring对Hibernate事务管理

    谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中 我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...

  9. Spring中的事务管理

    事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性( ...

随机推荐

  1. Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)

     我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. 首先介绍一个重要方法那就是requestWindowF ...

  2. 用百度地图API打造方便自己使用的手机地图

    有钱人咱就不说了,因为偶是个穷银--因为穷,所以去年买的Huawei C8650+到现在还在上岗,对于没有钱买好的配置的手机的童鞋来说,类似于百度,谷歌,高德等商家的地图在自己的机器上跑起来确实是有点 ...

  3. WEKA运行参数修改(RunWeka.ini文件)

    一般使用weka进行数据挖掘的时候会碰到两个问题,一是内存不够,二是libsvm使用不了,这时就需要重新配置RunWeka.ini文件,解决上述问题.查看RunWeka.ini原文如下: # Cont ...

  4. CSS3盒模型display:box简述

    display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. box-f ...

  5. Android 蓝牙 socket通信

    Android中蓝牙模块的使用 使用蓝牙API,Android应用程序能够执行以下功能: 扫描其他蓝牙设备查询本地已经配对的蓝牙适配器建立RFCOMM通道通过服务发现来连接其他设备在设备间传输数据管理 ...

  6. 【占位】HihoCoder1317 跳舞链

    跳舞链 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近遇到一个难题,他需要破解一个棋局. 棋局分成了n行,m列,每行有若干个棋子.小Ho需要从中选择若干行使得 ...

  7. upper_bound函数,binary_check函数

    个人心得:二分的经典运用,刚开始就是upper_bound可能难以实现一点,还有就是要注意没找到的时候 lower_bound 返回大于等于key的第一个元素的下标.upper_bound 返回大于k ...

  8. Cam350导入Allegro的*.rou文件

    如果生产allegro的生产文件有椭圆形钻孔,生成.rou.直接自动导入到cam350是没办法成功的. 以下说说本人的步骤.allegro里面的单位都是mm 在cam350的File-->Imp ...

  9. Python学习系列(三)(字符串)

    Python学习系列(三)(字符串) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) 一个月没有更新博客了,最近工作上有点小忙,实在是没有坚持住,丢久又有感觉写的必要了 ...

  10. find 使用指南

    find 使用方法整理 -name  按照文件名查找文件. -perm  按照文件权限来查找文件. -user  按照文件属主来查找文件. -group  按照文件所属的组来查找文件. - n表示文件 ...