版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28666193/article/details/86417344
概述:
- Spring的概述、SpringIOC入门(XML)、Spring的Bean管理、Spring属性注入
- Spring的IOC的注解方式、Spring的AOP开发(XML)
- Spring的AOP的注解开发、Spring的声明式事务、JdbcTemplate。
- SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用。
1 Spring 事务管理
1.1 事务
- 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败。满足ACID的四个特性。
- 原子性:事务不可分割
- 一致性:事务执行前后数据完整性保持一致
- 隔离性:一个事务的执行不应该受到其他事务的干扰
- 持久性:一旦事务结束,数据就持久化到数据库
- 事务的隔离性引发的安全性问题——读写:脏读、重复读、虚读(幻读)、丢失更新(写问题);
- 事务的隔离级别:读未提交、读已提交、重复读、序列化;
1.2 Spring事务管理的核心API
Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。
- PlatformTransactionManager:平台事务管理器,接口,是Spring用于管理事务的真正的对象。有两个常用实现类来完成事务的管理
- DataSourceTransactionManager :底层使用JDBC管理事务
- HibernateTransactionManager :底层使用Hibernate管理事务
- TransactionDefinition :事务定义信息,用于定义事务的相关的信息:隔离级别、超时信息、传播行为、是否只读
- TransactionStatus:事务状态:用于记录在事务管理过程中,事务的状态的对象
1.3 事务传播行为
Spring中提供了七种事务的传播行为,定义了事务之间的关系。事务一般在业务层完成使用,事务传播行为主要用来解决复杂业务中多业务方法的相互调用问题。
- 多个操作在同一事务中
- PROPAGATION_REQUIRED :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
- PROPAGATION_SUPPORTS :支持事务,如果A中有事务,用A中的事务。若A没有事务,不使用事务。
- PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。
- 多个操作在不同事务中
- PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
- PROPAGATION_NOT_SUPPORTED:如果A中有事务,将A的事务挂起。不使用事务管理
- PROPAGATION_NEVER :如果A中有事务,报异常
- 嵌套事务
- PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。
1.4 JDBC模板的另一种配置方式
JDBC模板使用时,需要通过Bean的方式和Set方法来进行初始化和属性注入使用。另一种方式是,在需要使用模板的类中继承Spring中的JdbcDaoSupport
类,使用其中的JDBC模板。只需要给其注入一个DataSource即可。
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Override
public void out(String from, double money) {
this.getJdbcTemplate().update("update user set money = money - ? where name=?", money,from);
}
@Override
public void in(String to, double money) {
this.getJdbcTemplate().update("update user set money = money + ? where name=?", money,to);
}
}
------------------------------------------------
<bean id="accountDao" class="com.leehao.springlearning.tx1.AccountDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
2 Spring事务Demo
Spring的事务管理,一定是通过事务管理器来完成的。事务管理器模板是方便事务管理的一组操作。分为编程式事务和声明式管理事务。
2.1 编程式事务
通过配置事务管理器、事务管理器模板,在使用事务的地方注入模板,来完成事务的操作。
@Override
public void transfer(String from, String to, double money) {
//使用事务管理模板
txTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
accountDao.out(from, money);
int i = 1/0;
accountDao.in(to, money);
}
});
}
---------------------------------------------------------------
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务管理器模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
<bean id="accountService" class="com.leehao.springlearning.tx1.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
<!-- 注入事务管理模板 -->
<property name="txTemplate" ref="transactionTemplate"></property>
</bean>
2.2 声明式事务——XML
在执行操作之前开启事务,执行完成后关闭事务,使用AOP的思想完成。
步骤:1. 事务管理器;2. 事务通知(相当于切面类);3.配置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>
<!-- 事务管理的规则,切入点位置的事务规则是怎样的 -->
<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- AOP管理事务 -->
<aop:config>
<aop:pointcut expression="execution(* com.leehao.springlearning.tx2.AccountService.*(..))" id="pointCut1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut1"/>
</aop:config>
2.3 声明式事务——注解
步骤:1.事务管理器;2.开启事务注解;3. 业务需要的类上加注解
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
------------------------------------------------------------
@Transactional(isolation=Isolation.DEFAULT, propagation=Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService {