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.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

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值