当我们的项目开发有对数据库的操作时,经常需要对事物进行管理;
使用Spring框架,spring容器提供对事物进行管理的配置,使用简单的配置便可将繁琐的事物管理托管给spring容器;
Spring提供两种配置事物的方式,一种是采用注解方式,另一种是xml文件配置方式;
采用注解方式配置步骤:
首先在spring的配置文件中的beans标签加入事物的命名空间:
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
然后开启事物注解引擎:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
在所需事物管理的业务类中添加事物注解:
@Service("personService")
@Transactional
public class PersonServiceImpl implements PersonService {
private JdbcTemplate jdbcTemplate;
@Override
public void save(Person person) {
jdbcTemplate.update("insert into person (name) values (?)",
new Object[] { person.getName() },
new int[] { java.sql.Types.VARCHAR });
}
添加注解后,该类中的所有业务方法默认情况下都在各自的事物中,每个方法里的操作公用一个事物;
在默认情况下,在业务方法中如果抛出了RuntimeException,业务操作会进行回滚;
如果抛出的是checkedException,业务操作不会进行回滚;
当然我们也能手动将事物操作配置成为我们所需要的:
可以再业务方法上添加注解,控制那种异常回滚,不会滚;该方法是否支持事物等:
@Override
@Transactional(noRollbackFor=RuntimeException.class)
public void update(Person person) {
jdbcTemplate.update("update person set name=? where id=?",
new Object[] { person.getName(), person.getId()},
new int[] { java.sql.Types.VARCHAR, java.sql.Types.INTEGER});
}
上面的注解表示抛出运行期异常的时候不会滚,
@Transactional(rollbackFor=Exception.class)表示checkedException时,会滚;
同时还能控制方法不支持事物:
@Transactional(propagation=Propagation.NOT_SUPPORTED)默认情况下的所有方式采用的propagation是
PropagationREQIRED