MySQL系列(11): 悲观锁 与 乐观锁
加锁操作是为了保证多事务操作同一数据时可能保持一致性。有 悲观锁 和 乐观锁 两种方式。
悲观锁 是由数据库引擎提供支持;乐观锁 是常规 SQL 语句版本检测的一种主观理解。
加锁操作是为了保证多事务操作同一数据时可能保持一致性。有 悲观锁 和 乐观锁 两种方式。
悲观锁 是由数据库引擎提供支持;乐观锁 是常规 SQL 语句版本检测的一种主观理解。
项目需要连接多个数据库时,在不使用数据库中间件的情况下,就需要配置多个数据源,如主从数据库、新旧数据库(结构不一致)。
手头项目新需求需要连接两个数据库,需要配置两个数据源。项目的基本结构是基于 Spring Boot 2.x + Mybatis + Druid + Common Mapper + PageHelper,所以本篇也是在此基础实现多数据源的配置,留个记录。
在学习 Eureka 之前,先了解下 Spring Cloud Netflix。
Spring Cloud Netflix 通过自动配置和绑定 Spring 环境以及 Spring 编程模型习惯为 Spring Boot 应用程序提供 Netflix OSS 集成。通过一些简单的注释,即可快速启用和配置常见的组件,并使用经过实战考验的 Netflix 组件构建大型分布式系统,提供的组件包含服务发布(Eureka)、断路器(Hystrix)、智能路由(Zuul)、客户端负载均衡。
Spring Cloud Eureka 是 Spring Cloud Netflix 套件之一;是 Netflix 服务发现服务器和客户端,主要负责服务发现;是一个基于 REST 的服务,能够方便地将服务注册到 Eureka 中进行统一管理,配置和部署高可用服务器,每个服务器将注册服务的状态复制到其他服务器(管理所有服务的信息和状态)。
Spring Boot 在默认情况下,提供了 /error
映射来处理所有错误,在 Servlet 容器里注册了全局的错误页面(Whitelabel Error Page)并返回客户端。
也可以自定义替换默认的异常处理, 通过实现 ErrorController 接口并注册为 Bean;或者添加 ErrorAttributes 类型的 Bean 来替换内容。
通常情况下,都会自定义全局异常统一处理,返回统一的消息结构体,便于了解和快速定位问题,Spring 提供了 @ControllerAdvice 注解,非常好实现。
Spring Boot 官方文档,错误处理:28.1.11 Error Handling
锁是计算机协调多个进程或并发访问某一资源的机制,数据也是供许多用户共享的资源。Java有锁机制,数据库也有锁机制。数据库锁定机制简单来说,是为了保证在并发情况下数据的一致性、有效性。
MySQL的锁机制是由存储引擎提供的,InnoDB
存储引擎支持行级锁和表级锁,默认级别行级锁(row-Level locking); MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking),BDB存储引擎采用的是页面锁(page-level locking),也支持表级锁,BDB已成为历史。
InnoDB 与 MyISAM 最大的不同有两点:一是支持事务,二是采用行级锁。
MySQL 5.7 官方文档:14.7.1 InnoDB Locking,14.7.3 Locks Set by Different SQL Statements in InnoDB,14.7.5 Deadlocks in InnoDB。
事务(Transaction )是InnoDB
存储引擎一个很重要并且区别于其它存储引擎的特性。 使用了 Innodb 存储引擎的数据库或表才支持事务。
事务:指作为单个逻辑工作单元执行的一组操作,这组操作的各个单元要么全部成功,要么全部失败。
事务处理:通过将一组相关操作组合为一个要么全部成功,要么全部失败的单元,保证数据一致性。
MySQL 5.7.5 版本,默认开启了only_full_group_by
模式,select
字段只能是group by的字段,否则会报错,可以关闭该模式,或使用 any_value(column)
来抑制该异常。
防止在生产中使用 update
语句漏带条件导致全表更新事故,开启安全更新模式,强制带条件更新,否则报错。
MySQL 默认支持多种存储引擎,提供了灵活的存储,以支持不同场景的应用。
MySQL 8.0 版本,默认使用 InnoDB
存储引擎,即建表语句(CREATE TABLE
) 不带 ENGINE=子句会创建 InnoDB 表。
关于 MySQL 存储引擎,可以单独写成一个系列文章,后续有时间列入计划中。The InnoDB Storage Engine - 官网,lternative Storage Engines - 替代引擎
经常需要查询一段日期范围内的数据,可能需要对日期时间进行格式转换以达到真正想要的数据,这里整理了几种方式。
整理下以前记录的一些常用但一时想不起的 SQL 语句,有些极其简单,有些则需要思考下。