spring 相关
常见问题总结:
事务不生效的原因
- @Transactional 注解的 rollbackFor 捕获的异常范围小于代码抛出的异常,导致不会滚
- 被@Transactional 注解修饰的方法, 修饰符非public 或者被final修饰. Aop没办法为其生成一个代理
- 在类中内部调用,这个时候会用this关键字.导致没有通过代理去走此方法,从而没有开启事务.
事务传播行为类型
- PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 - PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。 - PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。 - PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。 - PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 - PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。 - PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。
Readonly的解释:
- “只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。
但是你非要在“只读事务”里面修改数据,也并非不可以,只不过对于数据一致性的保护不像“读写事务”那样保险而已。
因此,“只读事务”仅仅是一个性能优化的推荐配置而已,并非强制你要这样做不可
参考资料:
https://www.cnblogs.com/liweibing/p/12982690.html
https://developer.ibm.com/zh/articles/j-master-spring-transactional-use/
https://mp.weixin.qq.com/s/JcHt99SAbNIlY063rmylpA
https://www.cnblogs.com/icenter/p/5279726.html