Spring的事务管理

时间:2021-02-21 20:29:27

Spring的事务管理

Ø 技术分析之Spring框架的事务管理相关的类和API
1. PlatformTransactionManager接口 – 平台事务管理器.(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类!
2. TransactionDefinition接口 – 事务定义信息.(事务的隔离级别,传播行为,超时,只读)
3. TransactionStatus接口 – 事务的状态
4. 总结:上述对象之间的关系:平台事务管理器真正管理事务对象.根据事务定义的信息TransactionDefinition 进行事务管理,在管理事务中产生一些状态.将状态记录到TransactionStatus中
5. PlatformTransactionManager接口中实现类和常用的方法
1. 接口的实现类
* 如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类
* 如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类
2. 该接口的常用方法
* void commit(TransactionStatus status)
* TransactionStatus getTransaction(TransactionDefinition definition)
* void rollback(TransactionStatus status)
6. TransactionDefinition
1. 事务隔离级别的常量
* static int ISOLATION_DEFAULT – 采用数据库的默认隔离级别
* static int ISOLATION_READ_UNCOMMITTED
* static int ISOLATION_READ_COMMITTED
* static int ISOLATION_REPEATABLE_READ
* static int ISOLATION_SERIALIZABLE
2. 事务的传播行为常量(不用设置,使用默认值)
* 先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!
* PROPAGATION_REQUIRED(默认值) – A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!
* PROPAGATION_SUPPORTS – A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.
* PROPAGATION_MANDATORY – A中有事务,使用A中的事务.如果A没有事务.抛出异常.
* PROPAGATION_REQUIRES_NEW(记)– A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)
* PROPAGATION_NOT_SUPPORTED – A中有事务,将A中的事务挂起.
* PROPAGATION_NEVER – A中有事务,抛出异常.
* PROPAGATION_NESTED(记) – 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)

Ø 技术分析之搭建事务管理转账案例的环境
1. 步骤一:创建WEB工程,引入需要的jar包
* IOC的6个包
* AOP的4个包
* C3P0的1个包
* MySQL的驱动包
* JDBC目标2个包
* 整合JUnit测试包
2. 步骤二:引入配置文件
* 引入配置文件
* 引入log4j.properties
* 引入applicationContext.xml

    1 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    2     <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    3     <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"/>
    4     <property name="user" value="root"/>
    5     <property name="password" value="root"/>
    6  </bean>
  1. 步骤三:创建对应的包结构和类

    • com.itheima.demo1
    • AccountService
    • AccountServlceImpl
    • AccountDao
    • AccountDaoImpl

      1. 步骤四:将类配置到Spring配置文件中

            1
            2 
            3
            4

      2. 步骤五:在业务层注入DAO ,在DAO中注入JDBC模板(强调:简化开发,以后DAO可以继承JdbcDaoSupport类)

            1
            2
            3
            4
            5     
            6

      3. 步骤六:编写DAO和Service中的方法

            1 /**
            2 * 转账的dao层操作
            3 * Created by yao on 2018/5/14.
            4 */
            5 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
            6     @Override
            7     public void out(String out, double money) {
            8         this.getJdbcTemplate().update(“update t_account set money = money - ? where name = ?”, money,out);
            9     }
           10     @Override
           11     public void in(String in, double money) {
           12         this.getJdbcTemplate().update(“update t_account set money = money + ? where name = ?”, money,in);
           13     }
           14 }

      4. 步骤七:编写测试程序

            1 /**
            2 * 转账的测试程序
            3 * Created by yao on 2018/5/14.
            4 */
            5 @RunWith(SpringJUnit4ClassRunner.class)
            6 @ContextConfiguration(“classpath:applicationContext.xml”)
            7 public class TestDemo01 {
            8     @Resource(name=”accountService”)
            9     private AccountService accountService;
           10     @Test
           11     public void run1(){
           12         accountService.pay(“郭靖”, “李思思”, 1000);
           13     }
           14 }