Spring框架的事务管理相关的类和API
- PlatformTransactionManager接口
- 平台事务管理器。(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类。
- TransactionDefinition接口
- 事务定义信息(事务的隔离级别,传播行为,超时,只读)
- TransactionStatus接口
- 事务的状态
- 总结:上述对象之间的关系:平台事务管理器真正管理事务对象,根据事务定义的信息TransactionDefinition进行事务管理,在管理事务中产生一些状态,将状态记录到TransactionStatus中
PlatformTransactionManager 接口中实现类和常用的方法
- 接口的实现类
- 如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类
- 如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类
- 该接口的常用方法
- void commit(TransacionStatus status)
- TransactionStatus getTransaction(TransactionDefinition definition)
- void rollback(TransactionStatus status)
TransactionDefinition
- 事务隔离级别的常量
- static int ISOLATION_DEFAULT—–采用数据库的默认隔离级别
- static int ISOLATION_READ_UNCOMMOTTED
- static int ISOLATION_READ_COMMITTED
- static int ISOLATION_REPEATABLE_READ
- static int ISOLATION_SERIALIZABLE
- 事务的传播行为常量
- 事务的传播行为:解决的是业务层之间的方法调用。
- 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出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)
事务管理转账案例
简化开发,以后DAO可以继承JdbcDaoSupprot类
步骤一:创建web工程,引入需要的jar包
- IOC的6个包
- AOP的4个包
- c3p0的1个包
- MySQL的驱动包
- JDBC的目标2个包
步骤二:引入配置文件
- 引入配置文件
- 引入log4j.properties
- 引入applicationContext.xml
*<!--配置c3p0连接池-->
<bean id = "dataSource" class="com.mchange.v2.c3p0.ComboPooledData
Source">
<property name ="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///spring_day03"/>
<property name="user" value="root"/>
<property name="password" vlaue="root"/>
</bean>
<!--配置JDBC模板类-->
<bean id = "jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
步骤三:创建对应的包结构和类
- com.xd.demo1
- AccountService
- AccountServiceImpl
- AccountDaoImpl
步骤四:引入Spring的配置文件,将类配置到Spring中
<bean id="accountService" class="com.xd.demo1.AccountServiceImpl">
</bean>
<bean id = "accountDao" class="com.xd.demo1.AccountDaoImpl">
</bean>
步骤五:在业务层注入DAO,在DAO中注入JDBC模板(简化开发,以后DAO可以继承JdbcDaoSupport类)
<bean id ="accountService" class="com.xd.demo1.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
<bean id ="accountDao" class="com.xd.demo1.AccountDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
步骤六:编写DAO和Service中的方法
public class AccountDaoImpl extends JdbcDaoSource implements AccountDao{
public void outMoney(String out,double money){
this.getJdbcTemplate().update("update t_account set money=money = ? where name=?",money,out);
}
public void inMoney(String in,double money){
this.getjdbcTemplate().update("update t_account set money = money+ ? where name=?" ,money,in)
}
}
步骤七:编写测试程序
这里写代码片