Spring基于AOP的事务管理
事务
事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务就将回到最开始的状态,仿佛一切都没发生过。例如,老生常谈的转账问题,从转出用户的总存款中扣除转账金额和增加转出用户的账户金额是一个完整的工作单元,如果只完成扣除或者增加都会导致错误,造成损失,而事务管理技术可以避免类似情况的发生,保证数据的完整性和一致性。同样在企业级应用程序开发过程中,事务管理技术也是必不可少的。
事务有四个特性:ACID
原子性(Atomicity):事务是一个原子操作,有一系列动作组成。原子性保证所有动作都完成,或者不执行任何动作。
一致性(Consistency):一旦事务完成(不论成败),系统必须确保它所建模的业务处于一致的状态。
隔离性(Isolation):可能有很多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论系统发生生什么系统错误,它的结果都不会受到影响,保证能从系统崩溃中恢复过来,通常事务的结果会被写入到持久化存储器中。
Spring事务是基于面向切面编程(Aspect Oriented Programming,AOP)实现的(文中会简单讲解AOP)。Spring的事务属性分别为传播行为、隔离级别、回滚规则、只读和事务超时属性,所有这些属性提供了事务应用方法和描述策略。如下我们介绍Spring事务管理的三个核心接口。
核心接口
TransactionDefinition接口是事务描述对象,提供获取事务相关信息的方法。
PlatformTransactionManager接口是平台事务管理器,用于管理事务。
TransactionStatus接口是事务的状态,描述了某一时间点上事务的状态信息。
关于事务管理器PlatformTransactionManager的详细介绍见:。
面向切面编程(Aspect Oriented Programing,AOP)采用横向抽取机制,是面向对象编程(Object Oriented Programing,OOP)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能、权限管理、异常处理等,该类功能往往横向地散布在核心代码当中,这种散布在各处的无关代码被称为横切。AOP恰是一种横切技术,解剖开封装对象的内部,将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect(切面),所谓切面,简单的说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP术语
连接点(Joinpoint):被拦截到的点,该连接点可以是被拦截到的方法、字段或者构造器;
切入点(Pointcut):指要对哪些连接点进行拦截,即被拦截的连接点;
通知(Advice):指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知;
目标(Target):代理的目标对象;
织入(Weaving):把增强的代码应用到目标上,生成代理对象的过程;
切面(Aspect):切入点和通知的集合。
项目实践
接下来我们就利用Spring的事务管理实现如上例子中所述的转账案例,利用mysql数据库创建名称为User的数据库,在User数据库中创建两张表:用户信息表(t_user)、用户存款表(account),然后实现用户A向用户B转账,更新数据库表信息,如果转账失败,则数据库信息自动返回转账前的状态。
在Eclipse下创建Java工程,其中必要的jar包以及工程中的类如下所示,jar包的下载地址为:Spring_AOP.zip。
可以到Linux公社资源站下载:
------------------------------------------分割线------------------------------------------
具体下载目录在 /2017年资料/1/3日/Spring基于AOP的事务管理/
------------------------------------------分割线------------------------------------------