声明式事务
1 事务与声明式事务的区别
1.事务:
把多个操作绑定在一起,要么全部成功,要么全部失败
2.声明式事务:
在程序中,指定开启或回滚事务的规则,程序根据设定好的规则,自动开启或回滚事务
2 声明式事务
2.1 我们第一步找到spring的配置文件
2.2 第二步我们就需要在你的标签里添加一下代码
<!-- 定义事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
ref=dataSource:这个dataSource是配置我们spring和MyBatis整合配置数据源的、
详情请看文档的第三点:spring和mybatis整合
2.3 设置事务属性
<!-- 设置事务属性-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 声明事务属性,定义事务开启规则-->
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" />
<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>
我们的事务属性这里就简约的说一下事务传播机制:
表示如果存在一个事务,则支持当前事务,如果没有,则按非事务方式执行
表示如果存在一个事务,则支持当前事务,如果没有,则自己开启一个新的事务
补充:
表示总是开启一个新事务,如果一个事务已经存在,则将这个存在的挂起,开启新的事务
还有等等 比如NESTED....
而这个标签的name属性里面填写的是,你需要做的增删改查功能是什么需要开启事务传播机制
2.4 定义切面
因为我们事务是在spring增强的功能上实现的,所以我们还需要定义切面
<!-- 定义切面-->
<aop:config>
<!-- 定义切面-->
<aop:pointcut id="serviceMethod" expression="execution(* com.t239.service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
</aop:config>
我们这就完成了声明式事务,我们还有一种方法就是使用注解形式
3 注解事务
我们做注解事务就更加简单一点:
3.1 首先我们第一步还是先定义事务管理器
<!-- 定义事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
3.2 我们第二步启动注解事务
将定义的事务管理器添加进去
<!-- 启动注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
3.3 我们就可以在你的需要事务处理的方法前加注解
我们通过注解进行事务回滚,以及提交,注解如下:
@Transactional
将这个注解添加到类前面,这个类所有的方法有有事务回滚提交功能
将这个添加到方法前,就只能对方法使用
Transactional的属性不止一种,有很多比如:
@Transactional(propagation= Propagation.SUPPORTS)
@Transactional(propagation=Propagation.REQUIRED)
等等等,这里就不一一解释说明了