事务有原子性(Atomicity),一致性(Consistency),隔离性(隔离),持久性(耐久性) 比如进行对多个mapper进行增删改查,这是希望同时发生或者同时不发生。
一个执行,一个不执行,那么不执行的容易产生脏数据,累计垃圾
所以需要加事务
事务添加可以通过注解即可
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
以及还有其他的 @Transactional(rollbackFor = Exception.class)
Spring事务失效的场景和原因
1、抛出检查异常导致事务不能正确回滚
原因:Spring默认只会回滚非检查异常
解决:配置rollbackFor属性
2、业务方法内自己try-catch异常导致事务不能正确回滚
原因:事务通知只有捉到了目标抛出异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决1 异常原样抛出
2 手动设置TransactionStatus.setRollbackOnly()
3、aop切面顺序导致事务不能正确回滚
原因:事务切面优先级最低,但如果自定义的切面优先级和他一样,还是自定义切面在内层,这时若自定义切面没有正确抛出异常。。。
解决1 异常原样抛出
2 手动设置TransactionStatus.setRollbackOnly()
4、非public方法
spring创建代理,添加事务通知都需要定义public 解决:改为public
rocketmq分布式事务方案
事务不能跨微服务,在某个微服务下方法用事务
分布式意味着跨服务,事务注解将失效。 我们需要一套分布式事务方案,尽管我们实际开发要减少发生分布式事务(选择一个服务实现事务就可以用事务注解)
方案:A系统发送半事务到mq,执行本地事务,对A事务进行会查,如果执行成功,则由半事务-----》全事务。只要commit才会投递
xml事务
<!--平台事务管理器-->
<bean id="transactionoManager1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1"></property>
</bean>
<!--事务增强、通知配置-->
<tx:advice id="txAdvice1" transaction-manager="transactionoManager1">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--事务aop增强 织入-->
<aop:config>
<aop:pointcut id="myPointcut1" expression="execution(*
com.study.service.Impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice1" pointcut-ref="myPointcut1"></aop:advisor>
</aop:config>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
3.1.2 注解声明式配置
1.平台事务管理器配置(xml方式)
2、事务通知的配置(@Transactional注解配置)
//属性可选,可以省略不写
@Transactional(value = "transactionoManager1",isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
- 1
- 2
- 3
- 4
- 5
3、事务注解驱动的配置<tx:annotation-driven/>
<!--事务注解驱动-->
<tx:annotation-driven/>
- 1
- 2
- 3
- 4
- 5
同步该文章
本文使用 文章同步助手 同步
网友评论