Spring事务管理api
1 spring事务管理两种方式
第一种 编程式事务管理(不用)
第二种 声明式事务管理
(1)基于xml配置文件实现
(2)基于注解实现
2 spring事务管理的api介绍
(1)spring针对不同的dao层框架,提供接口不同的实现类
(2)首先 配置事务管理器
搭建转账环境
1 创建数据库表,添加数据
2 创建service和dao类,完成注入关系
<!-- 配置c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 注入属性值 --> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"></property> <property name="user" value="root"></property> <property name="password" value="root"></property> </bean> <bean id="ordersService" class="cn.itcast.service.OrdersService"> <property name="ordersDao" ref="ordersDao"></property> </bean> <bean id="ordersDao" class="cn.itcast.dao.OrdersDao"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
(1)service层又叫业务逻辑层
(2)dao层,单纯对数据库操作层,在dao层不添加业务
(3)需求:小王 转账 1000 给 小马
- 小王少1000
- 小马多1000
/* * 做对数据库操作的方法,不写业务操作 * */ //小王少钱的方法 public void lessMoney() { String sql = "update account set salary=salary-? where username=?"; jdbcTemplate.update(sql, 1000,"小王"); } //小马多钱的方法 public void moreMoney() { String sql = "update account set salary=salary+? where username=?"; jdbcTemplate.update(sql, 1000,"小马"); }
//调用dao的方法 //业务逻辑层,写转账业务 public void accountMoney() { //小王少1000 ordersDao.lessMoney(); //出现异常 int i = 10/0; //小马多1000 ordersDao.moreMoney(); }
3 产生问题:
(1)如果小王少了1000之后,出现异常,小马不会多1000,钱丢失了
4 解决:
(1)添加事务解决,出现异常进行回滚操作
声明式事务管理(xml配置)
1 配置文件方式使用aop思想配置
第一步 配置事务管理器
<!-- 第一步 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入dataSource --> <property name="dataSource" ref="dataSource"></property> </bean>
第二步 配置事务增强
<!-- 第二步 配置事务增强 --> <tx:advice id="txadvice" transaction-manager="transactionManager"> <!-- 做事务操作 --> <tx:attributes> <!-- 设置进行事务操作的方法匹配规则 --> <tx:method name="account*" propagation="REQUIRED"/> <!-- <tx:method name="insert*" /> --> </tx:attributes> </tx:advice>
第三步 配置切面
<!-- 第三步 配置切面 --> <aop:config> <!-- 切入点 --> <aop:pointcut expression="execution(* cn.itcast.service.OrdersService.*(..))" id="pointcut1"/> <!-- 切面 --> <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/> </aop:config>
声明式事务管理(注解)
第一步 配置事务管理器
<!-- 第一步配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
第二步 配置事务注解
<!-- 第二步 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>
第三步 在要使用事务的方法所在类上面添加注解
@Transactional public class OrdersService {