Spring(二)

Spring事务管理可以使用编程式和声明式。

编程式事务处理在代码中,通过Java代码完成事务的。声明式事务处理,通过aop的思想,把事务以增强处理的方式,在运行的时候,添加到service层中的方法上面。

声明式事务处理的使用:

  • 声明事务增强处理,通过tx标签完成,指定事务规则,哪些方法使用什么样的事务
  • 定义切入点(service层的方法上)
  • 做编码处理,在service层添加声明事务处理,dao层中的原本那个默认的事务就不存在
配置文件

整体思路:

  1. 通过数据源创建事务管理器,用来管理连接信息
  2. 通过事务管理器,创建事务增强,指定事务规则
  3. 定义切入点
  4. 把切入点和事务增强编制在一起
  5. 事务就加在了service;一旦service层添加了声明式事务处理dao层的事务就不存在了。

一. 事务的传播属性

propagation(传播属性):

  • REQUIRED 表示需要事务(如果没有事务,开启新的事务,如果事务已存在,则加入当前事务)
  • SUPPORTS 表示支持事务(如果没有事务,不开启新事物,如果事务已存在,则加入当前事务)
  • REQUIRES_NEW 每次开启新的事务
  • MANDATORY 强制事务,必须开启事务,没有事务就报错
  • NEVER 不支持事务,如果事务已经开始,报错
  • NOT_SUPPORTED 不支持事务,如果事务已经开始,不会加入当前事务
  • NESTED 有一些数据库不支持

二. 事务隔离级别

isolation(隔离级别):

  • DEFAULT 采用数据库的默认隔离级别
  • READ_COMMITTED (避免脏读的发生)Oracle的默认隔离级别;脏读:一个事务读取了一个事务还没有提交的数据
  • REPEATABLE_READ 可重复读,避免不可重复读这种情况,mysql的默认隔离级别;重复读:一方更新,另一方查询两次结果不一样
  • SERIALIZABLE 幻影读,一方出入,一方查询两次查询结果不一致

隔离级别越高查询效率越低,但是数据一致性越高。从安全的角度考虑:isolation=”SERLALIZABLE”最安全,isolation=”READ_UNCOMMITTED” 最不安全;从效率考虑则是相反。

三. 读写性与异常

四.Sping的注解式开发

在Spring2.5后,简化Spring的xml配置文件,开启包扫描配置:Spring.xml

<!--配置注解式开发中的包扫描,哪些包中的类使用注解-->
<context:compontent-scan base-package="xxx"/>

常见的注解:

1.实例化相关注解

  • @Component:定义在类上,用于替换spring配置文件中的<bean>标签,创建自定义对象。
  • @Respository 用在DAO的实体类上
  • @Service 用在Service的实现类上
  • @Controller用在Action控制器上,注意使用以上注释时 ,生成bean的id默认 是类名称的首字母改小写
  • @Scope(“prototype|singleton”) 定义类上,指定该类的创建模式(singleton–单例 prototype–多例)

2.注入相关注解

  • @Autowired(spring提供的):可用在成员变量以及set方法上,用来给属性注入,默认根据类型注入,如果需要指定名称注入需要加入@Qualifier(value=”指定beanId”)注解,required:默认值为true 要求默认情况下注入bean必须存在,不存在报错
  • Resource(Java提供):可用在成员变量以及set方法上,用来给属性注入。默认根据名称注入,只有名称找不到的时候才会根据类型注入

3.事务相关注解

@Transactional:可用在类也可以用在方法上。用在类上:表示类中的所有方法都需要事务;用在方法上:表示此方法需要事务。注意:当类上的注解与方法的注解同时存在时,方法 的注解大于类上的注解

@Transactional相关属性:

  • propagation:事务的传播属性。参考第一条
  • isolation:事务的隔离级别(通常使用默认)参考第二条
  • readOnly:配置事务的读写性
  • rollbackFor:指定回滚的异常类
  • noRollbackFor:指定不会回滚的异常类