工作中不一定是每执行一条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中的属性
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只对方法中抛出的异常触发回滚,如果异常在方法中已经被捕获和处理,则不会触发回滚。