Springaop事务控制
2022-11-24 17:29:45 7 举报
AI智能生成
面向切面 aop 事务控制
作者其他创作
大纲/内容
事务
事务概念
事务是对数据库的一系列操作,进行统一的提交或者回滚,所有的操作必须一起完成,如果中间出现异常,那么就回滚到之前的数据状态。
事务的四个特性(ACID)
原子性(atomicity)
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。几个并行执行的事务,其执行结果必须与按某一顺序串行的结果相一致。
持久性(durability)
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该造成其丢失。
隔离性(isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
Spring中的事务管理
编程式的事务管理
1.配置事务管理器(以JdbcDataSource为例)
将dataSource连接池注入管理器中,这时因为jdbc进行管理时需要获得连接对象,然后用connection.setAutoCommit(false)使其不自动提交,
执行完后要conmmit,有异常的话要rollback。 能获取这个连接的就是dataSource连接池,而DataSourceTransactionManager事务管理器
是真正进行事务管理的类,而连接池又能获取到连接对象,所以要将其注入。
执行完后要conmmit,有异常的话要rollback。 能获取这个连接的就是dataSource连接池,而DataSourceTransactionManager事务管理器
是真正进行事务管理的类,而连接池又能获取到连接对象,所以要将其注入。
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.配置事务管理模板
<bean id = "transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<property name="transactionManager" ref="transactionManager"/>
</bean>
3.在Service中注入模板
<!-- service层注入transactionTemplate -->
<bean id = "accountService" class="com.cfx.service.impl.AccountServiceImpl">
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
<bean id = "accountService" class="com.cfx.service.impl.AccountServiceImpl">
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
@Override
public void transfer(String out, String in, Double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
accountDao.outMoney(out, money);
int i = 1/0;//若不进行事务管理,出现错误,outMoney()将会执行。
accountDao.inMoney(in, money);
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
@Override
public void transfer(String out, String in, Double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
accountDao.outMoney(out, money);
int i = 1/0;//若不进行事务管理,出现错误,outMoney()将会执行。
accountDao.inMoney(in, money);
}
声明式的事务管理
简介
Spring集成了很多内置的事务管理器,最常用两种便是DataSourceTransactionManager和HibernateTransactionManager:
DataSourceTransactionManager:用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;
HibernateTransactionManager:用于集成Hibernate框架时的事务管理.
DataSourceTransactionManager:用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;
HibernateTransactionManager:用于集成Hibernate框架时的事务管理.
基于AspectJ的方式
配置事务管理器..(切面)
<tx:advice id="accountAdvice" transaction-manager="transactionManager">
<!--配置事务传播性,隔离级别以及超时回滚等问题 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="*" rollback-for="Exception" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--配置切点 与切面-->
<aop:pointcut id="services" expression="execution(* com.cfx.service.*.*(..))" />
<aop:advisor pointcut-ref="services" advice-ref="accountAdvice" />
</aop:config>
因为采用切面的方式,所以其他位置将不需要改变。
<tx:advice id="accountAdvice" transaction-manager="transactionManager">
<!--配置事务传播性,隔离级别以及超时回滚等问题 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="*" rollback-for="Exception" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--配置切点 与切面-->
<aop:pointcut id="services" expression="execution(* com.cfx.service.*.*(..))" />
<aop:advisor pointcut-ref="services" advice-ref="accountAdvice" />
</aop:config>
因为采用切面的方式,所以其他位置将不需要改变。
0 条评论
下一页