前言:
去年九月份我和同事在极客时间上买了 丁雪丰 的Spring 全家桶学习,课程总共分为16章,我已经学了大半部分了,之前是在笔记本上记录,今天我想记录在Blog 上 ,分享更多的知识给有需要帮助的人,我会以章节数来作为文章的内容,原课程讲的更详细,我这里就一些具体的点做一个总结。
一.Spring 的事务抽象
一致的事务模型
- JDBC/Hibernate/myBatis
- DataSource/JRA
事务抽象的核心接口
PlatformTransactionManager
- DataSourceTransactionManager
- HibernateTransactionManager
- JtaTransactionManager
TransactionDefinition
- Propagation
- Islation
- Timeout
- Read-only status
事务传播特性
传播性 | 值 | 描述 |
PROPAGATION_REQUIDED | 0 | 当前有事务就用当前的,没有就用新的 |
PROPAGATION_SUPPORTS | 1 | 事务可有可无,不是必须的 |
PROPAGATION_MANDATORY | 2 | 当前一定要有事务,不然抛异常 |
PROPAGATION_REQUIRES_NEW | 3 | 无论是否有事务,都起一个新的事务 |
PROPAGATION_NOT_SUPPORTED | 4 | 不支持事务,就按非事务方式运行 |
PROPAGATION_NEVER | 5 | 不支持事务,如果有事务则抛异常 |
PROPAGATION_NESTED | 6 | 当前有事务就在当前事务里再起一个事务 |
事务隔离特性
隔离性 | 值 | 脏读 | 不可重复读 | 幻读 |
ISOLATION_READ_UNCOMMITTED | 1 | yes | yes | yes |
ISOLATION_READ_COMMITTED | 2 | no | yes | yes |
ISOLATION_REPEATABLE_READ | 3 | no | no | yes |
ISOLATION_SERIALIZABLE | 4 | no | no | no |
编程式事务
TransactionTemplate
- TransactionCallback
- TransactionCallbackWithoutResult
PlatformTransactionManager
- 可以传入 TransactionDefinition 进行定义
声明式事务
https://www.cnblogs.com/ooo0/p/11029629.html
基于注解的配置方式
开启事务注解的方式:
- @EnableTransactionManagement
- <tx:annotation-driven/>
一些配置
- proxyTargetClass
- model
- order
@Transactional
- transactionManager
- propagation
- isolation
- timeout
- readOnly
- 怎么判断回滚
二. Spring 的JDBC 异常抽象
Spring 会将数据操作的异常转换成 DataAccessException
无论使用哪种数据访问方式,都会使用一样的异常
Spring 是怎么认识那些错误码的?
- 通过SQLErrotCodeSQLExceptionTranslator 解析错误码
ErrorCode 定义
- org/springframework/jdbc/support/sql-error-codes.xml
- Classpath下的 sql-error-codes.xml
SpringBoot 定制错误码
三. SpringBoot 常用的注解
可参考:https://blog.csdn.net/tangthh123/article/details/104092510
四. Actuator
URL | 作用 |
/actuator/health | 健康检查 |
/actuator/beans | 查看容器中的所有Bean |
/actuator/mapping | 查看Web 的URL 映射 |
/actuator/env | 查看环境信息 |
解禁所有的 Endpoint
application.properties 或者 application.yml中 配置参数
management.endpoints.web.exposure.include=*
五. 多数据源.分库分表.读写分离的关系
1.几种常见情况
- 系统需要访问几个完全不同的数据库,这个时候可以配置俩个数据源
- 系统需要访问同一个库的主库和备库,也就是要用到读写分离的时候, 一个主库,俩个备库,单独配置数据源,读写实现分离
- 系统需要访问一组做了分库分表的数据库(垂直拆分 ,水平拆分),尽量用数据库中间件。
六.事务的本质
Spring 的声明式事务本质上是通过AOP 来增强了类的功能。
Spring的 AOP 本质上是为类做了一个代理
- 看似在调用自己的路诶,实际用的是增强后的代理类
问题的解法:
- 访问增强后的代理类的方法,而非直接访问自身的方法
七.慢日志的配置
阿里巴巴数据库连接池的一些展开说明:
系统属性配置
- druid.stat.logSlowSql=true
- druid.stat.slowSqlMillis=3000
SpringBoot
- spring.datasource.druid.filter.stat.enabled=true
- spring.datasource.druid,filter.stat.log-slow-sql=true
- spring.datasource.druid.filter.stat.slow-sql-millis=3000