Spring事务处理

什么是软件框架
软件框架(Software framework),通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。
框架的功能类似于基础设施,与具体的软件应用无关,但是提供并实现最为基础的软件架构和体系。软件开发者通常依据特定的框架实现更为复杂的商业运用和业务逻辑。这样的软件应用可以在支持同一种框架的软件系统中运行。
对于Spring框架来说:Spring是一套建筑标准,比如承重标准、丈量标准,通风标准等,并规范了结构:框架式结构,浇筑式结构,且定义了建筑的每个组成部分名字与接口,比如电力系统的接口是220v,通风系统的孔径必须符合ISO标准等。
攻城狮是建筑的设计师,在基础框架与标准下,设计出符合客户要求的建筑图纸,并决定了使用哪个厂家生产的水泥,砖块,和电力,通风等系统。
程序猿就是泥瓦匠,电工,依照图纸,完成各个部分的堆砌,安装,部署,装饰等等。说白了,程序猿就是一板砖的。
IOC
所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。
AOP
面向切面编程,作为对面向对象的补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。
什么是事务
逻辑上的一组操作,这组操作要么全部成功,要么全部失败。
事务的特性
事务有四大特性:原子性、一致性、隔离性、持久性。
原子性是指事务是一个不可分割的工作单位,事务中的操作,要么都发生,要么都失败 一致性指的是事务前后数据完整性保持一致 隔离性是指一个用户事务进行时,不能受到其他事务的影响。(通过隔离级别处理) 持久性是指一个事务一旦被提交,它对数据库中数据的改变是永久性的,即使数据库发生故障也不应该对其有任何影响。
事务接口
Spring为我们提供事务管理主要的接口,一共有三个
事务管理器:PlatformTransactionManager
事务定义信息(隔离、传播、超时、只读):TransactionDefinition
事务具体运行状态:TransactionStatus
事务具体运行状态(TransactionStatus) TransactionStatus接口定义了获得和判断事物状态的方法
事务管理器(PlatformTransactionManager)
Spring会根据持久层不同的实习选择不同的事务管理器
DataSourceTransactionManager : JDBC和MyBatis HibernateTransactionManager : Hibernate 所以Spring处理MyBatis和JDBC的事务使用的是一样的方法,而Hibernate是另外一种实现方法
事务定义信息(TransactionDefinition)
-
ISOLATION 开头定义的是事务的隔离级别
-
PROPAGATION 开头定义的是事务的传播行为
-
TIMEOUT 开头定义的是事务的超时信息
ISOLATION
事务的隔离级别,主要是解决在实际开发中可能遇到的三个问题:
-
脏读,A进行update、insert时候,B读取了中间状态不知道对不对的值;
-
不可重复读,B在A 的update操作前后,读到的数据不一致;
-
幻读,B在A的insert操作前后,读到了的数据不一致
MySQL底层采用的是REPEATABLE_READ隔离级别 Oracle底层采用的是READ_COMMITTED隔离级别
PROPAGATION
事务的传播行为:主要是解决业务层方法之间的相互调用的问题(比如一个业务需求为同时调用A和B两个数据库操作) 事务的传播行为有七种,又分为三类: 第一类共同点:如果 A 方法中有事务,则调用 B 方法时就用该事务,即:A和B方法在同一个事务中。 PROPAGATION_REQUIRED:如果 A 方法中没有事务,则调用 B 方法时就创建一个新的事务,即:A和B方法在同一个事务中。 PROPAGATION_SUPPORTS:如果 A 方法中没有事务,则调用 B 方法时就不使用该事务。 PROPAGATION_MANDATORY:如果 A 方法中没有事务,则调用 B 方法时就抛出异常。
第二类共同点:A方法和B方法没有在同一个事务里面。 PROPAGATION_REQUIRES_NEW:如果 A 方法中有事务,则挂起并新建一个事务给 B 方法。 PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事务,则挂起。 PROPAGATION_NEVER:如果 A 方法中有事务,则报异常。
第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。 PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行