1、spring事务管理spring
一、 什么是事务数据库
事务(Transaction)是多个操做数据库的步骤(CRUD)的集合,是并发控制的单位,是用户定义的一个操做序列。这些操做要么都作,要么都不作,是一个不可分割的工做单位。达到保持数据完整性的做用。express
二、 事务特色编程
1) 原子性mybatis
一个事务全部对数据库操做是一个最小单位,不可细分;要么执行,要么不执行并发
2) 隔离性编码
事务之间能够同时执行,不会互相干扰,是隔离的spa
3) 一致性.net
事务执行成功数据库变动,事务执行失败数据库不变动,即事务一致性代理
4) 持久性
事务执行成功,以后的结果是持久的,一直保持
三、 事务配置方式
1) 编程式事务
编程式事务指的是经过编码方式实现事务,须要配置文件添加配置,而且在编码中也须要配置,如今使用愈来愈少
2) 声明式事务
创建在AOP之上的。对方法先后进行拦截,而后在目标方法开始以前建立或者加入一个事务,在执行完目标方法以后根据执行状况提交或者回滚事务;声明式事务配置通常有五种(abcde),两种配置方式较为经常使用:我喜欢用第一种
a) 使用AOP的方式实现事务配置
i. aop:pointcut标签配置参与事务的类,因为是在Service中进行数据库业务操做,配的应该是包含那些做为事务的方法的Service类。
首先应该特别注意的是id的命名,一样因为每一个模块都有本身事务切面,因此我以为初步的命名规则由于 all+模块名+ServiceMethod。并且每一个模块之间不一样之处还在于如下一句:
expression="execution(* com.test.testAda.test.model.service.*.*(..))"
其中第一个*表明返回值,第二*表明service下子包,第三个*表明方法名,“(..)”表明方法参数。
ii. aop:advisor标签主要将事务属性配置和开启事务类进行关联
iii. tx:attributes标签主要是配置事务的方法属性类型,name=add*中表示事务中全部以add开头的方法。
b) 注解式配置
i. Spring-mybatis
ii. Spring-hibernata
iii. 注意@Transaction注解的使用
这个注解只能使用在public方法上,别的不会报错,可是没有效果;若是这个注解放在类上,类里面的全部public方法都会有效。
iv. 全注解的使用方式
v. 注解中属性详解
Propagation是传播属性,REQUIRED表明使用当前开启事务;rollbackFor=Exception.class表明出现异常回滚,能够指定多个异常;
Timeout =1 事务的超时性;
Isolation表明事务隔离级别,上面的是默认;
配置readOnly=true表示当前事务为只读事务,若是为false为可读写,默认是false。
vi. 注解位置
注解最好放在具体的类或者方法上,不要放在接口上,由于注解不具备继承性,因此若是读取不到注解信息,将不会读取到相应对象二进行事务配置。
c) 每一个bean都有一个代理
https://blog.csdn.net/hjm4702192/article/details/17277669
d) 全部bean共享一个代理基类
https://blog.csdn.net/hjm4702192/article/details/17277669
e) 使用拦截器
https://blog.csdn.net/hjm4702192/article/details/17277669
四、 事务隔离级别
事务隔离级别指的是多个并发事务之间的隔离程度
1) ISOLATION_DEFAULT
此种隔离级别是事务管理默认配置的,使用数据库的默认隔离级别,上面的配置中就是使用此种级别,下面的四种级别与jdbc的相对应。
2) ISOLATION_READ_UNCOMMITTED
未提交读。容许其余事务能够看到本事务未提交的数据,可形成脏读、幻读和不可重复读
3) ISOLATION_READ_COMMITTED
提交读。其余事务只能读取到本事务提交后的数据,本事务不提交,其余事务没法读取到本事务数据,可防止脏读,可能出现幻读和不可重复读
4) ISOLATION_REPEATABLE_READ
可重复度。保证事务不提交就不会读取到其数据,防止脏读和不可重复读,可能发生幻读。
5) ISOLATION_SERIALIZABLE
可串行化。牺牲效率顺序执行事物,若是事物执行异常,其余事务阻塞。防止脏读,幻读和不可重复。
五、 事务传播属性
1) PROPAGATION_REQUIRED
使用当前事务,若是当前无事务,新建一个事务
2) PROPAGATION_SUPPORTS
使用当前事务,若是当前无事务,使用非事务方式执行
3) PROPAGATION_MANDATORY
使用当前事务,若是当前无事务,抛出异常
4) PROPAGATION_REQUIRES_NEW
每次执行新建事务,若是当前存在事务,将当前事务挂起
5) PROPAGATION_NOT_SUPPORTED
以非事务方式执行,若是当前存在事务,将当前事务挂起
6) PROPAGATION_NEVER
以非事务方式执行,若是当前存在事务,抛出异常
7) PROPAGATION_NESTED
嵌套类事务,若是当前存在事务,则在当前事务内新建事务并执行,若是当前无事务,与第一条一样方式执行
2、数据库隔离级别
一、未提交读
(Read Uncommitted):容许脏读,也就是可能读取到其余会话中未提交事务修改的数据
二、提交读
(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
三、可重复度
(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,可是还存在幻象读
四、可串行化
(Serializable):彻底串行化的读,每次读都须要得到表级共享锁,读写相互都会阻塞
3、数据异常
一、脏读
A事务正在添加zhangsan信息,可是还没提交,数据库就已经能读取到张三信息。
二、幻读
多个事务同时修改同一条记录,事务之间不知道彼此存在,当事务提交以后,后面的事务修改的数据将会覆盖前事务,前一个事务就像发生幻觉同样
例如:同时修改某行数据
事务A将姓名字段修改成zhangsan,
事务B将姓名字段修改成lisi
事务提交,事务B将覆盖A数据,也就是zhangsan丢失。
三、不可重复读
在A事务中,两次读取同一个数据,在A事务第一次读取数据以后,B事务修改这条数据,当A事务再次读取这条数据以后,获取到的结果与第一次读到的不一致。(读取到的数据不一致)
事务完成操做以前,不容许其余事务进行操做,可避免