一、编程式事务控制相关对象
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(设置隔离级别和传播行为),可以加在类上或者方法上。如果类和方法上都有,那具体的以方法为准