spring事务管理的两种方式
(1)编程式事务管理(不用)
(2)声明式事务管理1.基于xml配置文件实现2.基于注解实现
范例:搭建转账环境
1.创建数据库表,添加数据id,username,salary
2.创建service和dao ,完成注入
需求:小王转账给小马
dao:public void lessMoney(){
String sql = "update account set salary=salary-? where username=?";
jdbcTemplate.update(sql,100,"小王");
}
public moreMoney(){
String sql = "update account set salary=salary+? where username=?";
jdbcTemplate.update(sql,100,"小马");
}
}
service:public void accountMoney(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
dao d = (dao) context.getBean("dao");
d.lessMoney();
d.moreMoney();
}
产生问题:(1)如果小王少了100之后,出现异常,小马不会多100,钱丢失。
解决:添加事务解决,出现异常后进行回滚操作
声明式事务管理(xml配置文件)
第一步 配置事务管理器‘
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步 配置事务的增强
<tx:advice id="txadvice(随便)" transaction-manager="transactionManager">
<tx:attributes>
<!--设置进行事务操作的方法-->
<tx:method name="account*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步 配置切面
<aop:config>
<!--切入点-->
<aop:pointcut expression="execution(*空格com.service.OrderService.*(..))" id="pointcut1"/>
<!--切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="poincut1"/>
</aop:config>
此时注意:MySql的MyISAM不支持事务,而InnoDB支持。而数据库默认使用MyISAM引擎,所以需要手动修改引擎
声明式事务管理(注解)
第一步 配置事务管理器
第二步 开启事务注解
<tx:annoation-driven transaction-manager="transactionManager"/>
第三步 在要使用事务的方法的类上加注解
@Transactional
public class OrderService{
.......}