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.properties</value>
</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>
<!--
propagation 事务传播机制 REQUIRED:必须(默认) SUPPORTS:支持 isolation 事务隔离等级
timeout 事务超时时间,默认-1,不准超时 read-only 事务是否为只读,默认false rollback-for
设置能触发回滚的异常类型,默认 RuntimeException,添加可用逗号隔开 no-rollback-for
设置不会触发事务回滚的异常类型
注意:这里name指的是方法名
-->
<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<User> 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.properties</value>
</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!
更多推荐
MybatisHelperPro <<<<自己开发的一个Mybatis反编译插件,能快速生成代码,有兴趣可以看看
@Author 瞌睡虫
@mybatis-3.2.2
@Database: mysql 5.7.15
@Tool: MyEclipse