spring事务管理器:
pring事务管理器高层抽象主要包括3个接口:
PlatformTransactionManager事物管理器
TransactionDefinition事物的定义信息(隔离,传播,超时,只读)
TransactionStatus 事物具体运行状态
搭建转账环境:
package com.hkd.dao;
import org.springframework.jdbc.core.JdbcTemplate;
public class OrdersDao {
//创建模板对象变量
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
//在dao层只做数据库的操作
public void lessMoney(){
String sql="update account set salary=salary-? where username=?";
jdbcTemplate.update(sql, 1000, "李华");
}
public void addMoney(){
String sql="update account set salary=salary+? where username=?";
jdbcTemplate.update(sql, 1000, "黎明");
}
}
//业务类
package com.hkd.service;
import com.hkd.dao.OrdersDao;
public class OrdersService {
private OrdersDao ordersdao;
public void setOrdersdao(OrdersDao ordersdao) {
this.ordersdao = ordersdao;
}
//调用dao方法,业务逻辑,写转账操作
public void account(){
//调用方法实现转账
ordersdao.addMoney();
ordersdao.lessMoney();
}
}
产生的问题:
1-如果转账过程中一方出现异常的状况,如:小王转给小六一千后出现异常,小王的前少了,但是小刘的钱没有增加,那
么导致这个前丢失。
解决:添加事务解决,出现异常进行回滚操作
声明式事务管理(xml配置)
使用aop思想进行配置
1- 配置事务管 理器
2-配置事务的增强
3-配置切面
<!-- 配置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:///springday03"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--*******************************************配置文件方式(aop思想)事务管理器开始******************************************** -->
<!--第一步:部配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--属性值注入,指定数据库-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--第二步:部配置事务的增强 -->
<!-- transaction-manager会自动指向事务管理器 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<!--事务操作 -->
<tx:attributes>
<!--设置进行事务操作的方法匹配规则 ,匹配只能做什么规则的方法做事务,
说明:结构固定,以后开发需要修改的就是<tx:method name="account*"/>里面的方法参数
-->
<tx:method name="account*"/>
</tx:attributes>
</tx:advice>
<!--第三步:配置切面 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* com.hkd.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>
<!--第二步:开启事务的注解 -->
<!-- transaction-manager="transactionManager"指定用的哪个事物管理器 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 第三步:要在使用事务的方法所在类上面添加注解 -->
<!-- **********************事务管理器配置结束****************-->