Spring的事务控制实例深度解析
作者:逃逸线LOF
Spring 的事务管理是其最核心的功能之一,它提供了一个一致且强大的抽象层,极大地简化了企业级应用中的事务控制。Spring 官方文档指出,全面的交易支持是使用 Spring 框架最令人信服的原因之一。
Spring 主要提供声明式和编程式两种事务管理方式,其中声明式事务管理(基于 @Transactional 注解)因其代码侵入性最小,成为了最主流的实践方式。
一、编程式事务控制对象
1.1 PlatformTransactionManager(了解)

1.2 TransactionDefinition


read uncommited 读未提交什么都无法解决
read commited 读已提交,解决脏读
repeatable read 可重复读,解决不可重复读问题
serializable 串行化,都可以解决,但是执行效率非常低

传播行为,解决业务方法执行时候的事务统一性问题。
举例:A业务方法调用B业务方法。require中:A业务方法没有事务B业务方法就新建一个事务
,A业务方法有事务,B业务方法就加入到这个事务当中。
以上只需要记住TransactionDefinition是事务的定义对象,内部维护事物相关参数。
1.3 TransactionStatus

transactionStatus自动封装不需要你给出参数
平台事务管理器+事务定义对象=事务状态对象
采用声明的方式来处理事务。这里所说的声明,就是指配置文件中声明,用在Spring配置文件中的声明式的处理事务来代替代码式的处理事务。
优点:

<!-- 配置一个平台事务管理器 注意如果不是使用JDBC Mybatis例如HIBERNET此处配置需要更改-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 通知:事务的增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 本质就是设置事务的属性信息的 <tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="-1" read-only="false"/> -->
<!-- name="*":匹配通知内所有方法名,代表任意方法名称。
但是!不是项目里所有方法都生效,它受 AOP 切入点 (pointcut) 二次约束。 -->
<!-- <tx:method name="transfer" isolation="REPEATABLE-READ" propagation="REQUIRED" timeout="-1" read-only="false"/> 也可以单独进行配置 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置AOP事务的织入-->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>*是通配符,例如tx:method name="update*" 指的是以update开头的方法名
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}
public void transfer(String outMan,String inMan, double money) {
accountDao.out(outMan,money);
accountDao.in(inMan,money);
}2.2 基于注解的声明式事务控制
一般性原则:不是自己自定义的类就在xml文件中进行配置。自己定义的用注解
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public void transfer(String outMan,String inMan, double money) {
accountDao.out(outMan,money);
accountDao.in(inMan,money);
}或者:
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}
public void transfer(String outMan,String inMan, double money) {
accountDao.out(outMan,money);
accountDao.in(inMan,money);
}
}表示这一个类下所有方法都被控制
一旦使用了@Transactional注解,在applicationContext.xml中一定要加事务注解驱动
<tx:annotation-driven transaction-manager="transactionManager"/>

到此这篇关于Spring的事务控制实例深度解析的文章就介绍到这了,更多相关Spring事务控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
