[Java资深架构师必备技能]Spring事务控制

一、编程式事务控制相关对象

1.1.PlatformTransactionManager接口

平台事务管理器

方法 说明
TransactionStatus getTransaction(TransactonDefination defination) 获取事务的状态信息
void commit(TransactionStatus status) 提交事务
void rollback(TransactionStatus status) 回滚事务

1.2.TransactonDefination

事物的属性定义

方法 说明
int getIsoIationLevel() 获得事务的隔离级别
int getPropogationBehavior() 获得事务的传播行为
int getTimout() 获得超时时间
int isReadOnly() 是否只读
  • 事务的隔离级别,用来解决脏读、可不重复读、虚读
    • ISOLATION_DEFAULT
    • ISOLATION_READ_UNCOMMITTED
    • ISOLATION_READ_COMMITTED
    • ISOLATION_REPEATABLE_READ
    • ISOLATION_SERIALIZABLE
  • 事务的传播行为
    • REQUIRED:如果当前没有事务、就新建一个事务、如果已经存在一个事务,就加入到这个事务中。默认值
    • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
    • MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
    • REQUERS_NEW:新建事务,如果当前在事务中,就把当前事务挂起。
    • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
    • NEVER:以非事务方式运行,如果当前存在事务,抛出异常
    • NESTED:如果当前存在事务,则嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作
    • 超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
    • 是否只读:建议查询时设置为只读

1.3.TransactionStatus

事物的运行状态

方法 说明
boolean hasSavepoint() 是否存储回滚点
boolean isCompleted() 事务是否完成
boolean isNewTransaction() 是否新事物
boolean isRollbackOnly() 事务是否回滚

二、基于XML的声明式事物控制

  • 声明式事物控制
    • Spring的声明式事物控制就是采用声明的方式来处理事务,xml中或者注解中配置事务来替代代码控制
  • 作用:
    • 事务管理器不侵入开发的组件。业务逻辑对象就不会意识到正在事务管理器之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要定义在文件中重新配置即可
    • 在不需要事务管理的时候,只要在设定文件上修改一下,即可移除事务管理服务,无需改变代码重新编译,这样维护起来方便
    • Spring声明式事物控制底层就是AOP

2.1.第一步:引入依赖包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

2.2.第二部:配置xml

<!--配置平台事务管理器-->
<bean id="transactionManager" class="DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>
<!--通知事务的增强-->
<tx:advice id="txAdvice" transaction-manger="transactionManager">
	<tx:attributes>
    	<tx:method name="*"/>
    </tx:attributes>
</tx:advice>
<!--配置事务的aop切入点-->
<aop:config>
	<aop:advisor advice-ref="txAdvice" pointcut="execution(* )"/>
</aop:config>

三、基于注解的声明式事物控制

事务注解驱动

<tx:annotation-driven transaction-manager="transactionManager">
@Transactional(设置隔离级别和传播行为),可以加在类上或者方法上。如果类和方法上都有,那具体的以方法为准

猜你喜欢

转载自blog.csdn.net/weixin_48568292/article/details/107687407