1、 为何要用到声明事务管理
如果一个service方法有两个dao层方法 如果第一个dao方法能通过,第二个dao方法不能通过
则在结果中并不能得到我们想要的结果 例如转账 :两个动作 给自己扣钱 给对方价钱 如果扣钱动作完成
请对方却没加到钱 则会产生错误,因此我们要引入 “声明事务管理”
*****************************
事务管理是针对于数据库的
*****************************
2、6.2XML配置方式添加事务管理(tx、aop元素)
【操作思路】:
1、 确定目标:需要对AccountService 的 transfer方法,配置切入点
2、 需要Advice (环绕通知),方法前开启事务,方法后提交关闭事务
3、 配置切面和切入点
步骤1、
导入aop相关的包(4个),引入约束名称空间(aop和tx 的名称空间)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
步骤2、 配置spring容器,applicationContext.xml文件
!-- 第一步:定义具体的平台事务管理器(DataSource事务管理器) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 和数据库关联上-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 第二步:定义通知,通知中要处理的就是事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 配置事务的属性定义 -->
<tx:attributes>
<!-- 配置具体的方法的事务属性
isolation//事务的隔离级别,默认是按数据库的隔离级别来
propagation//事务的传播行为,默认是同一个事务
timeout="-1":事务的超时时间,默认值使用数据库的超时时间。
read-only="false":事务是否只读,默认可读写。
rollback-for:遇到哪些异常就回滚,其他的都不回滚
no-rollback-for:遇到哪些异常不回滚,其他的都回滚。和上面互斥的
-->
<tx:method name="transfer" isolation="DEFAULT" propagation="REQUIRED" timeout="-1" read-only="false"/>
<!-- 支持通配符
要求service中 方法名字必须符合下面的规则
-->
<tx:method name="save*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 第三步:配置切入点,让通知关联切入点,即事务控制业务层的方法 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="bean(*Service)" id="txPointcut"/>
<!-- 切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
<!-- dao -->
<bean id="accountDao" class="com.igeek.dao.AccountDaoImpl">
<!-- 注入数据源,才拥有jdbctemplate -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 业务层 -->
<bean id="accountService" class="com.igeek.service.AccountServiceImpl">
<!-- 注入dao -->
<property name="accountDao" ref="accountDao"/>
</bean>
</beans>
-----------------------------------------------------------------------------------------------------
注解配合方式添加事务管理 @Transactional
1 、确定目标( bean 的方法)
在service层添加
//@Transactional/会对该类中,所有的共有的方法,自动加上事务--全局的设置,默认是可写
//@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
@Transactional //缺省值即为上面的值
有些方法需要改变事务 如查询 设置为只读 所以在fundAccount()方法上设置
@Transactional(readOnly=true)//使用局部覆盖全局的
2、创建.XML文件配置
1、<!-- 第一步 定义具体的平台事务管理器(DataSource事务管理器) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 别人提供的对象你无法使用注解 所以只能用XML形式进行关联 -->
<property name="dataSource" ref="dataSource"/>
</bean>
2、<!-- 第二步开始事务注解开发 配置事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>