Spring快速笔记3

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 {

猜你喜欢

转载自blog.csdn.net/qq_28666193/article/details/86417344