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>
-
步骤三:创建对应的包结构和类
- com.itheima.demo1
- AccountService
- AccountServlceImpl
- AccountDao
-
AccountDaoImpl
-
步骤四:将类配置到Spring配置文件中
1
2
3
4 -
步骤五:在业务层注入DAO ,在DAO中注入JDBC模板(强调:简化开发,以后DAO可以继承JdbcDaoSupport类)
1
2
3
4
5
6 -
步骤六:编写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 } -
步骤七:编写测试程序
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 }
-