一个数据库事务一般包含了多个对数据库的读/写操做,它存在包含两个目的:
1、为数据库操做提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即便在异常状态下仍能保持一致性的方法。
2、当多个应用程序在并发访问数据库时,能够在这些应用程序之间提供一个隔离方法,以防止彼此的操做互相干扰。spring
因此事务是用来处理异常和并发问题的数据库
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是没法提供事务功能的。 Spring支持编程式事务和声明式事务策略,通常都推荐采用声明式事务策略。编程
一、编程式事务:PlatformTransactionManager或TransactionTemplate(推荐)。并发
二、声明式事务(1、基于 xml 配置,2、基于注解):使用TransactionProxyFactoryBean来配置事务代理Bean,它是一个专门为目标Bean生成事务代理的工厂Bean(事务代理的方法改写了目标Bean的方法,就是在目标Bean的方法执行以前加入开始事务,在目标Bean的方法正常结束以前提交事务,若是遇到特定异常则回滚)。Spring的声明式事务策略是基于Spring AOP的。框架
Spring中关于事务配置老是由三个组成部分:分别是DataSource、TransactionManager和代理机制这三部分。不管哪一种配置方式,通常变化的只是代理机制这部分。DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,好比使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。spa
三、Spring支持7种事务传播规则。.net
四、Spring事务管理是经过AOP实施事务加强(基于接口代理或动态字节码技术)。3d
基于接口动态代理的AOP事务加强,接口方法必须都是public的,实现类的方法也必须都是public的,不可以有protected、private、final。
基于CGLib字节码动态代理的方案是经过扩展被加强类,动态建立子类的方式进行AOP加强植入的,因为final、static、private修饰的方法不可以被子类覆盖就没法实施AOP加强。代理
五、filter和interceptor区别:orm
过滤器(filter)和拦截器(interceptor,就是AOP的一种实现策略)主要区别以下:
a、两者适用范围不一样。Filter是Servlet规范规定的,只能用于Web程序中,而拦截器既能够用于Web程序,也能够用于Application、Swing程序中。
b、规范不一样。Filter是在Servlet规范定义的,是Servlet容器支持的,而拦截器是在Spring容器内的,是Spring框架支持的。
c、使用的资源不一样。同其余代码块同样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,所以能使用Spring里的任何资源、对象(各类bean),而Filter不行。
d、深度不一样。Filter只在Servlet先后起做用,而拦截器可以深刻到方法先后、异常跑出先后等,拦截器的使用有更大的弹性。
Ref: