spring学习笔记(24)基于注解配置事务

使用注解的方式配置事务极为便利,在xml文件上只需声明我们的注解,然后即可直接在相应service类通过标注注解来完成事务配置。相对于配置在xml文件,简洁了需要,但配置信息分散,会导致易读性大大减弱。

使用步骤:

1. 在spring容器中注册注解搜索器

目的是使分散在各业务类中的注解得以生效

 <!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

这里引用了我们之前文章实例中配置好的hibernate对应事务管理器,同时将proxy-target-class设为true来强制使用CGLib代理。

2. @Transactional注解位置

@Transactional是我们的事务注解,标注了该注解的目标都会被注入事务。它可以注解在接口定义、接口方法、类定义、类的public方法上,但有一下两点是需要注意的:
1. 如果我们需要想为我们的特定方法配置细粒度的事务,可在类已标注注解的基础上再在方法上标注@Transactional。这样会覆盖类定义上的注解
2. @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
2. Spring建议在业务实现类而不在上使用@Transactional注解。由于注解不能被继承,故业务接口标注的@Transactional注解 不会被业务实现类继承,如果我们在配置<tx:annotation-driven>时将proxy-target-class设为true,则业务类不会添加事务增强,照样工作在非事务的环境下。而如果我们的proxy-target-class设为false,则可能出现错误:

java.lang.ClassCastException: com.sun.proxy.$Proxy11 cannot be cast to com.yc.service.MyBaseServiceImpl

@Transactional常用属性说明

属性名称 功能说明
readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。
rollbackFor 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称:@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
noRollbackFor 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
propagation 该属性用于设置事务的传播行为
isolation 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout 该属性用于设置事务的超时秒数,默认值为-1表示永不超时

使用不同的事务管理器

如果我们需要使用到不同的事务管理器,如:

bean id="transactionManager1"  class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <qualifier value="transactionManager1" />
</bean>
<bean id="transactionManager2" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <qualifier value="transactionManager2" />
</bean>

在这里我们,配置了两个事务管理器,然后使用qualifier标签为其起了一个名字。然后,在我们的业务实现类中,我们可以使用如下注解来声明使用哪个事务管理器:

@Transactional("sessionFactory1")
public void method1(){
    ....
}
@Transactional("sessionFactory2")
public void method2(){
    ....
}

另一方面,如果我们有很多方法都要用到同一个事务管理器,如果每个在标注@Transactional注解都加上名字就会略显繁琐,我们可以通过如下方式自定义一个新的注解来满足我们需求:

@Transactional("sessionFactory1")
public @interface Transactional1 {
}

这样,我们就可以使用@Transactional1来取代@Transactional(“sessionFactory1”)了。

你可能感兴趣的:(java,spring,mysql,事务管理,注解事务)