Spring04事务管理-案例转账
1.事务管理
简单回顾
- 事务:一组业务操作,要么全部成功,要么全部不成功
- 事务有四个关键属性(特点)ACID:
原子性:一系列的动作,要么都成功,要么都失败。
一致性:数据和事务状态要保持一致。
隔离性:为了防止数据被破坏,每个事务之间都存在隔离性。
持久性:一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响。
1.1:Mysql事务的操作 :
Mysql事务操作—Savepoint(回滚保存点)
需求:AB必须,CD可选
1.2三个顶级接口
PlatformTransactionManager
TransactionStatus
TransactionDefinition
PlatformTransactionManager
1.PlatformTransactionManager
接口是 Spring 提供的平台事务管理器,用于管理事务。该接口中提供了三个事务操作方法,具体如下。
TransactionStatusgetTransaction(TransactionDefinition definition):用于获取事务状态信息。
void commit(TransactionStatus status):用于提交事务。
void rollback(TransactionStatus status):用于回滚事务。
在项目中,Spring 将 xml 中配置的事务详细信息封装到对象 TransactionDefinition 中,然后通过事务管理器的 getTransaction() 方法获得事务的状态(TransactionStatus),并对事务进行下一步的操作。
2.TransactionDefinition
TransactionDefinition 接口是事务定义(描述)的对象,它提供了事务相关信息获取的方法,其中包括五个操作,具体如下。
String getName():获取事务对象名称。
int getIsolationLevel():获取事务的隔离级别。
int getPropagationBehavior():获取事务的传播行为。
int getTimeout():获取事务的超时时间。
boolean isReadOnly():获取事务是否只读。
在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务。
通常情况下,数据的查询不会改变原数据,所以不需要进行事务管理,而对于数据的增加、修改和删除等操作,必须进行事务管理。如果没有指定事务的传播行为,则 Spring3 默认的传播行为是 required。
3.TransactionStatus
TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。其中包含六个操作
2.案例转账
1.准备工作需要导入Jar包
2. 转账基本过程:
3.环境搭建
- 创建一个数据表:account
- Dao层
- service层
- bean
- 然后测试
//account数据库表
id username money
//dao
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Override
public void out(String outer, Integer money) {
// TODO 自动生成的方法存根
this.getJdbcTemplate().update("update account set money= money - ? where username=?",money,outer);
}
@Override
public void in(String iner, Integer money) {
// TODO 自动生成的方法存根
this.getJdbcTemplate().update("update account set money= money + ? where username=?",money,iner);
}
//service层
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
@Override
public void transfer(String outer, String iner, Integer money) {
accountDao.out(outer, money);
//断电其他操作错误
int i=1/0;
accountDao.in(iner, money);
}
}
//测试
@Test
public void demo1() {
String xmlPath="applicationContext.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
AccountService accountService=(AccountService) applicationContext.getBean("accountService");
accountService.transfer("nadou", "faker", 100);
4.AOP配置基于XML
在spring xml 配置aop自动生成代理,进行事务管理
1. 配置管理器
2. 配置事务详情
3. 配置aop
配置applicationContext.xml
<!-- 4 事务管理 -->
<!-- 4.1 配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 4.2 事务的详情(事务通知) 在aop筛选的基础上 ,对ABC三个确定使用什么事务。例如:AC读写,B只读等
tx:attributes 用于配置事务详情(属性)
tx:method name=""用于拘役配置
propagation:传播行为
isolation:隔离级别
-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!-- 4.3 AOP编程,目标类ABCD(4个链接点),切入点表达式确定增强的连接器,获得切入点:ABC-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.spring03shiwuManager.service..*.*(..))"/>
</aop:config>
将此配置加入到搭配的环境里