SSM框架之事务管理器的配置

SSM 框架学习 (Mybatis&Spring篇)

前面已经完成了Mybatis和Spring框架的学习与整合,但并没配置有事务管理器。

配置这东西前我们首先得知道这是个什么东西,有什么用?

事务管理器就是用于管理对数据库的一系列读写操作,进行统一提交或回滚,这样能有效的防止数据库出现问题,如:脏读,幻读等。关于幻读、脏读可以看看这篇文章,推荐了解【事务属性之隔离级别】

配置前还需要先了解事务属性,有五个:事务传播机制、事务隔离等级、事务超时时间、是否只读、回滚规则

事务传播机制
属性值 说明
REQUIRED(默认值) 指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事务,则创建一个新事务。REQUIRED能够满足大多数事务需求,可做首选。
SUPPORTS 指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
NOT_SUPPORTED 指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。
REQUIRES_NEW 总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
MANDATORY 指定的方法必须在当前事务内执行,若当前没有事务,则直接抛出异常。
NESTED 指定的方法必须在事务内执行。若当前存在事务,则在嵌套事务内执行;若当前没有事务,则创建一个新事务。
NEVER 指定的方法不能在事务环境下执行,若当前存在事务,就直接抛出异常。
事务隔离等级
属性值 说明
DEFAULT(默认) 采用数据库默认的事务管理级别。Mysql默认为REPEATABLE_READ;Oracle默认为READ_COMMITTED
READ_UNCOMMITTED(未提交读取) 允许脏读取,但不允许更新丢失。
READ_COMMITTED(提交读取) 解决脏读,存在不可重复读与幻读。
REPEATABLE_READ(可重复读取) 解决脏读、不可重复读,存在幻读。
SERIALIZABLE(序列化) 不存在并发问题,最严格隔离级别,但并不推荐。
其他属性
属性名 说明
timeout 事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时
read-only 事务是否为只读,默认值为false
rollback-for 设定能够触发回滚的异常类型;Spring默认只在抛出runtime exception时才标识事务回滚,设定多个可用逗号隔开。
no-rollback-for 设定不触发回滚的异常类型;Spring默认checked Exception不会触发事务回滚,设定规则同上

好,到这你应该已经对事务管理器有所了解了,现在介绍如何配置,下面将介绍两种配置方式,这里贴主要的配置代码,就不贴整个项目代码了。

1、全配置文件配置

这些配置写在Spring配置文件中applicationContext.xml,连接数据库信息就根据自己的写在database.properties属性文件并放到resources文件夹。

 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>classpath:database.propertiesvalue>
    property>
bean>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>           
bean>


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
bean>
<tx:advice id="txAdvice">
    <tx:attributes>
        
        <tx:method name="find*" propagation="SUPPORTS" timeout="-1" read-only="false" rollback-for="Exception,RuntimeException" no-rollback-for="" isolation="DEFAULT" />
        <tx:method name="add*" propagation="REQUIRED" />
        <tx:method name="del*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="*" propagation="REQUIRED" />
    tx:attributes>
tx:advice>
2、注解配置方式

首先要在业务层的实现方法里添加@Transactional实现事务支持,如下:

@Transactional
@Service("userService")
public class UserServiceImp implements UserService {
    @Autowired
    public UserMapper userMapper;

    // 属性添加用逗号隔开
    @Transactional(propagation = Propagation.SUPPORTS)
    public List findUserWithName(User user) {
        try {
            return userMapper.getUserList(user);
        } catch (RuntimeException e) {
            e.printStackTrace();
            throw e;
        }
    }
}

添加完注解回到配置applicationContext.xml部分,除了数据源配置部分,现在只剩两条配置了


<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>classpath:database.propertiesvalue>
    property>
bean>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>           
bean>


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

OK!

@Author 瞌睡虫
@mybatis-3.2.2
@Database: mysql 5.7.15
@Tool: MyEclipse

你可能感兴趣的:(java,SSM框架学习)