spring事务配置

工作中不一定是每执行一条sql语句就进行提交,有可能是一批业务的操作,这一批sql语句,要么全部执行成功,要么全部执行失败。因此就需要用到事务来进行管理。

在spring中,提供了对事务的管理类。

首先需要在beans的配置文件上添加tx的命名空间和地址

xmlns:tx="http://www.springframework.org/schema/tx"

http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd

同时配置进行事务管理的数据源

    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    

以上配置完成后,即可在程序的数据持久层进行事务管理。

在想要进行事务控制的类或public方法上使用注解@Transactional

    @Override
    @Transactional
    public void insert(List<TPjXjypsq> list) {
        //TODO
    }

如上,如果一个类中,类和方法都使用了该注解,以方法上的注解为优先。如果方法的修饰词不是public,虽然不会报错,但事务不会被管理。

 

@Transactional中的属性

propagation:可选的传播性设置,参数为枚举

isolation:可选的隔离性设置,参数为枚举

readOnly:可读性,参数为boolean

timeout:超时时间,以s为单位,参数为int类型

rollbackFor:遇见指定的异常则回滚,参数是class类型,且必须为Throwable子类,可以是一个参数rollbackFor=Exception.class或多个rollbackFor={a.class,b.class}。

rollbackForClassname:遇见指定的异常的名称则回滚,参数是String,但必须是Throwable子类的名称。可以是一个参数或多个。

noRollbackFor:遇见指定的异常则必须不回滚,参数同rollbackFor。

noRollbackForClassname:遇见指定的异常的名称则必须不回滚,参数同rollbackForClassname。

 

由于以上方式需要对每个进行事务管理的地方都增加注解@Transactional,因此可以使用aop配合,对多个类(方法)进行事务管理。

 

注意事项

1、@Transactional默认抛出异常为runableException类及下面子类,如果所抛出的类不属于该范围,例如抛出Exception类型的异常,则不会触发事务回滚。

2、@Transactional只对public类型有效,其他类型虽然不会报错,但是均无效。

3、@Transactional只对方法中抛出的异常触发回滚,如果异常在方法中已经被捕获和处理,则不会触发回滚。

posted @ 2018-03-01 18:02  一响贪欢  阅读(140)  评论(0编辑  收藏  举报