非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿
感谢传智博客及黑马程序猿
Spring的事务管理
回顾事务
什么是事务?
事务四个特性?
不考虑隔离性产生读问题
不考虑隔离性产生一类写问题-丢失更新
解决丢失更新
解决读问题-设置事务隔离级别
Mysql默认隔离级别 repeatable read
Hibernate事务特点:不是自动提交
应用场景:银行转账
Spring使用事务接口
• Spring事务管理高层抽象主要包括3个接口
• PlatformTransactionManager:事务管理器
• TransactionDefinition:事务定义信息(隔离、传播、超时、只读)
• TransactionStatus:事务具体运行状态
首先,配置事务管理器,使用接口PlatformTransactionManager对应的实现类配置
配置说明Spring的事务概述
Spring支持两种方式事务管理
编程式的事务管理
在实际应用中很少用;通过TransactionTemplate手动管理事务
使用xml配置声明式事务
开发中推荐使用(代码入侵性最小);Spring的声明式事务是通过AOP实现的
搭建事务操作的环境(转账)
第一步:创建数据库,创建表
数据表第二步:创建dao,Service
第三步:配置Service和dao对象,完成注入关系
<bean id="userService" class="cn.xx.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="cn.xx.UserDao"></bean>
第四步:连接池配置,注入到dao
<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"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="userDao" class="cn.xx.UserDao">
<property name="dataSource" ref="dataSource"></property>
</bean>
public class UserDao extends JdbcTemplate{
}
第五步:在dao实现转账的方法
public void out() {
String sql = "update account set money = money - 100 where id = ?";
this.getJdbcTemplate().update(sql, 1);
}
public void in() {
String sql = "update account set money = money + 100 where id = ?";
this.getJdbcTemplate().update(sql, 2);
}
第六步:在Service里面调用dao的方法实现转账的逻辑
public void accountMoney {
userDao.out();
userDao.in();
}
产生问题
userDao.out();
int a = 10 / 0;
userDao.in();
如果东方不败少了100.之后,出现异常,小奥不会多100,但是100丢失了
使用事务可以解决钱丢失的问题。
编程式事务管理
第一步:导入事务的相关jar包,引入相关的约束
第二步:配置事务管理器
使用jdbcTemplate,使用PlatformTransactionManager接口里面的是实现类DataSourceTransactionManager
<bean id="transactionManager" class="org.springframework.jdb.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第三步:配置事务管理器的模板
<bean id="" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
第四步:在Service里面注入事务管理器的模板
public class UserService{
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate getTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
}
<bean id="userService" class="cn.xx.UserService">
<property name="userDao" ref="userDao"></property>
<property name="transactionTemplate" ref="transactioinTemplate"></property>
</bean>
第五步:需要在Service里面手动写代码,进行事务管理
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus args0) {
userDao.out();
int a = 10 / 0;
userDao.in();
}
});
第六步:测试编程是事务操作
如果进行操作时候,没有出现异常,正常执行,但是调用了一个方法之后,出现了异常,事务回滚。
声明式事务管理(重点)
基于aspectj的xml方式
使用Aop思想实现的事务管理
第一步:配置事务管理器
<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>
<!-- name:service里面的方法accountMoney -->
<tx:method name="accountMoney" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步:配置切面
<aop:config>
<aop:pointcut expression="execution(* cn.xx.UserService.accountMoney(..))" id="point1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="point1"/>
</aop:config>
基于注解方式
第一步:配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步:开始事务的注解
<!-- 开启事务的注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
第三步:在哪个类中的方法使用事务,就在那个类上面使用注解
@Transaction
public class UserService {
}
不是很详细,还请大家自己找些资料查看
网友评论