大型运输行业实战_day11_2_事务理论与实际生产配置事务管理
1.什么是事务(Transaction:tx)
数据库的某些需要分步完成,看做是一个整体(独立的工作单元),不能分割,要么整体成功,要么整体生效。“一荣俱荣,一损俱损”,最能体现事务的思想。
案例:银行转账案例,A给B转账1000元钱,会涉及到减少A账户余额的1000元,增加B账户的余额1000元。该过程,必须要成功,都成功,要失败,都失败。
该特性体现在SQL中,就是一个操作中的多条SQL语句,要么都执行成功,要么都失败。
事务必须体现四个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy),简称ACID。
1.原子性:表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作成功,整个事务才提交,若事务中任何一个操作失败,已经执行的所有操作都必须撤销,让数据恢复到最初的状态。
2.一致性:整个事务操作成功之后,数据库所处的状态和业务的规则是一致的,即数据不会被破坏。比如A转账给B的案例中,无论成功与否,A和B的总金额是不会改变的。
3.隔离性:在并发数据库操作时,不同的事务拥有各自的数据空间,他们的操作要做到彼此之间相互不产生干扰,而数据库的不同隔离级别对应着不同的干扰程度,隔离级别越高,数据的一致性越高,但是并发性越弱。
4.持久性:一旦事务提交成功之后,事务中所有的数据操作都必须被持久化到数据库中,及时提交事务之后,数据库马上回滚,在数据库重启时,页必须保证能通过某种机制恢复数据。
2.数据库并发问题
数据库可以拥有多个客户端,若多个客户端并发地访问数据库中相同的资源,如果没有采取必要的隔离措施,则会导致各种并发问题,破坏数据的完整性。
这些问题归结为5类,包括3类数据读问题(脏读,不可重复读,幻读)和2类数据更新问题(第一类丢失更新,第二类丢失更新)。
2.1.脏读
2.2.不可重复读
2.3. 幻读
一般使用表锁机制可以,防止新增数据.
2.4. 第一类丢失更新
2.5 第二类丢失更新
3.事务的隔离级别
尽管数据库提供了锁机制的DML操作方式,但是直接使用锁还是非常麻烦的,为此数据库提供了自动锁机制。
只要用户指定事务的隔离级别,数据库就会分析事务的SQL语句,自动的为数据资源添加适合的锁,并会负责锁的维护,可提高性能。
SQL92标准中定义了4个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工作,
根据不同的隔离级别,可以导致不同的结果,当然不同的事务隔离级别能解决数据并发问题的能力是不同的。 如图:
4.Spring对事务的支持
4.1. Spring的事务管理主要包括3个接口
1.TransactionDefinition :封装事务的隔离级别,超时时间,是否为只读事务和事务的隔离级别和传播规则等事务属性,可通过XML配置具体信息。
2.PlatformTransactionManager:根据TransactionDefinition提供的事务属性配置信息,创建事务。
2.TransactionStatus:封装了事务的具体运行状态。比如,是否是新开启事务,是否已经提交事务,设置当前事务为rollback-only等。
两种方式:
Spring支持编程式事务管理和声明式事务管理:
1.编程式事务管理:事务和业务代码耦合度太高。
2.声明式事务管理:侵入性小,把事务从业务代码中抽离出来,提供维护性。
4.2.Spring的事务管理
1.PlatformTransactionManager:接口统一抽象处理事务操作相关的方法;
1):TransactionStatus getTransaction(TransactionDefinition definition):
根据事务定义信息从事务环境中返回一个已存在的事务,或者创建一个新的事务,并用TransactionStatus描述该事务的状态。
2):void commit(TransactionStatus status):
根据事务的状态提交事务,如果事务状态已经标识为rollback-only,该方法执行回滚事务的操作。
3):void rollback(TransactionStatus status):
将事务回滚,当commit方法抛出异常时,rollback会被隐式调用
2.在使用spring管理事务的时候,首先得告诉spring使用哪一个事务管理器; 看图
3.常用的事务管理器:
DataSourceTransactionManager:使用JDBC,MyBatis的事务管理器;
HibernateTransactionManager:使用Hibernate的事务管理器;
4.3.事务传播规则
Spring在TransactionDefinition接口中定义了七种事务传播规则,规定了事务方法和事务方法发生嵌套调用时事务该如何进行传播,如下图:
4.4.实际案例配置
4.4.1 声明式事务管理-基于xml配置
配置说明
参数详解:
注意:更多详细配置参看官方文档约 364页!
完整的生产配置:
生产上使用的事务管理详细使用,可以参看之前的博客: 大型运输行业实战_day11_1_aop理论与aop实际业务操作
4.4.2.声明式事务管理-基于注解配置(一般不使用注解)
步骤如下:
使用:
生产应用场景:
每个service组件上都要贴标签. 开发中: 通常的使用 xml配置. 若某一个类需要特殊的处理,贴标签.
到此事务管理完成!
大型运输行业实战_day11_2_事务理论与实际生产配置事务管理的更多相关文章
- 大型运输行业实战_day11_1_aop理论与aop实际业务操作
1.aop概述 Spring的AOP:什么叫做AOP:Aspect oritention programming(面向切面编程)什么是切面:看图,业务方法 执行前后.AOP的目的:AOP能够将那些与业 ...
- 大型运输行业实战_day10_1_自定义事务管理类
1.创建事务管理类 TransactionManager.java package com.day02.sation.transaction; import com.day02.sation.uti ...
- 大型运输行业实战_day15_1_全文检索之Lucene
1.引入 全文检索简介: 非结构化数据又一种叫法叫全文数据.从全文数据(文本)中进行检索就叫全文检索. 2.数据库搜索的弊端 案例 : select * from product whe ...
- 大型运输行业实战_day14_1_webserivce简单入门
1.简单使用 1.1.服务端 1.编写接口 package com.day02.sation.ws; /** * Created by Administrator on 1/12. */ public ...
- 大型运输行业实战_day13_1_定时任务spring-quartz
1.jar包 拷贝quartz-2.2.3.jar包到项目 2.编写定时任务类TicketQuart.java package com.day02.sation.task; import com.da ...
- 大型运输行业实战_day12_1_权限管理实现
1.业务分析 权限说的是不同的用户对同一个系统有不同访问权限,其设计的本质是:给先给用户分配好URL,然后在访问的时候判断该用户是否有当前访问的URL. 2.实现 2.1数据库设计标准5表权限结构 2 ...
- 大型运输行业实战_day01_2_需求文档
1.文档格式 (见模板文件) 2.Axure简单使用 2.1安装Axure傻瓜式安装 2.2简单使用axure 3.总结 需求文件完成后应该包括三种文件: 1.axure文件 2.axure生成的ht ...
- 大型运输行业实战_day01_1_业务分析
1.业务分析 发展历史: 上车收费-->车站买票(相当于先收钱后上车)-->站务系统--->联网售票 2.项目结构 3.开发流程分析 1.业务分析 图文并茂 ...
- 大型运输行业实战_day09_2_站间互售实现
1.添加站间互售入口 对应的html代码 <button onclick="otherStation()">站间互售</button> 对应的js发送函数 ...
随机推荐
- 权重比较(id class 标签)
权重的取值: 按照 id class 标签 的顺序在其位置上标出1或者0 例如下面的例子 <!DOCTYPE html> <html lang="en"&g ...
- day3----编码-集合-深浅copy-文件操作-函数初识
本文档主要内容: 一 编码 二 集合 三 深浅copy 四 文件操作 五 函数初识 首先,我们来看看两个字符串的比较 打开cmd,进入dos界面 >>>a='xingchen@' & ...
- SAP HANA数据库架构部署方法
HANA作为内存数据库,在实现高性能访问的同时,必须也要有稳定的架构,今天我们就来看看企业部署SAP HANA时应该如何来设计数据库的架构. HANA数据库在安装时,有以下几种选择方法,为方便大家理解 ...
- out.println与<%!%>的功能一样
<%! public static final String DBDRIVER = "A"; public static final String DBURL = " ...
- Python常用时间操作总结【取得当前时间、时间函数、应用等】转载
Python常用时间操作总结[取得当前时间.时间函数.应用等] 转载 2017-05-11 作者:清风乐逍遥 我要评论 这篇文章主要介绍了Python常用时间操作,包括取得当前时间.时间函 ...
- ansible常用模块即用法
Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块,通过 ansible-doc -s 模块名 又可以查看该模块有哪些参数可以使用. 下面 ...
- API / DOM
浏览器特性 当控制台报错时,IE9会停止执行JS.当打开控制台时会执行后续JS ------------------------------------------------------------ ...
- 01.制作ico图标的工具
制作ico图标的工具在线转换地址: http://lvwenhan.com/convertico/ http://lvwenhan.com/convertico/Converticon.swf
- linux指令tar笔记
tar 工具常用选项如表所列. 选项 说明 -c 创建存档文件,与-x相斥 -t 列出档案文件的文件列表 -x 解包存档文件,与-c相斥 -A 合并存档文件 -d 比较存档文件与源文件 - ...
- linux-2.6.22.6 内核源代码包的文件目录介绍
下载一个linux-2.6.22.6.tar并解压 再其解压的文件中加入下面的bat脚本 生成当前文件的目录树脚本如下: @rem 此BAT文件名一定不能是"tree.bat",否 ...