MySQL 事务

事务属性原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作必须全部执行,不允许只执行其中的一部分操作;一致性(consistency)一个事务中的所有操作要么全部执行成功,要么全部执行失败;隔离性(isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的;持久性(durability)一旦事务提交,则其所做的修改就会持久化保存到磁盘中,此时即使系统崩溃,修改的数据也不会丢失;隔离级别InnoDB存储引擎默认的事务隔离级别是可重复读 REPEATABLE RAED。读未提交 READ UNCOMMITTED 说明:一个事务中的修改,即使没有提交,对其他事务也都是可见的; 问题:存在脏读 Dirty Reads问题,即A事务中的操作读取了B事务中尚未提交的修改;读已提交 READ COMMITTED 说明:一个事务中的操作只读取其他事务已提交的修改; 问题:存在不可重复读 Non-Repeatable Reads问题,即A事务中两次重复查询同一行数据的操作得到了不同的结果,因为在两次查询之间,B事务修改或删除了这一...

MySQL 半同步复制

半同步复制半同步复制(semi-synchronous replication),主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。通过rpl_semi_sync_master_wait_point参数,控制半同步模式下主库在返回给会话事务成功之前提交事务的方式。参数 rpl_semi_sync_master_wait_point 有两个值: AFTER_COMMIT(5.6默认值) AFTER_SYNC(5.7默认值,但5.6中无此模式)半同步复制降级当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。AFTER_COMMIT“Innodb Engine Commit” 在binlog提交之后;master将每个事务...

MySQL 日志分析

MySQL中有六种日志文件,分别是: 重做日志(redo log) 回滚日志(undo log) 归档日志(binlog) 错误日志(error log) 慢查日志(slow query log) 查询日志(general log) 中继日志(relay log)错误日志(error log)Problems encountered starting, running, or stopping mysqld通用查询日志(general query log)通用日志:Established client connections and statements received from clients重做日志(redo log) 作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。 内容:物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。 产生:事务开始之后就产生redo log,redo ...

MySQL 锁分析

lock与latch在数据库中,lock与latch都可以被称为“锁”。但是两者有着截然不同的含义,本章主要关注的是lock。latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正如在大多数数据库中一样,是有死锁机制的。   lock latch 对象 事物 线程 保护 数据库内容 内存数据结构 持续时间 事务期间 临界资源 模式 行锁、表锁、意向锁 ...

MySQL 锁分析

乐观锁🔒概念定义:系统认为数据的更新在大多数情况下是不会产生冲突的,只在数据库更新操作提交的时候才对数据作冲突检测。如果检测的结果出现了与预期数据不一致的情况,则返回失败信息。实现方式:在数据库表增加一个版本号的字段version,每次更新一行记录都使得该行版本号加一,开始更新之前先获取version的值,更新提交的时候带上之前获取的version值与当前version值作比较,如果不相等则说明version值发生了变化则检测到了并发冲突,本次操作执行失败,如果相等则操作执行成功。update table set columnA = 1, version = version + 1 where id = #{id} and version = #{oldVersion}适用场景:数据库乐观锁比较适合并发量不高并且写操作不频繁的场景。 优点:优点比较明显,由于在检测数据冲突时并不依赖数据库本身的锁机制,不会影响请求的性能,当产生并发且并发量较小的时候只有少部分请求会失败; 缺点:当应用并发量高的时候,数据库锁都是作用于同一行数据记录上,大量的请求同时请求同一条记录的行锁,会对数...

MySQL 数据库分表

自动创建月表通过结合MySQL存储过程与定时任务自动创建月表 优势:由于使用数据内置实现无外部依赖,不会因为网络环境和外部服务的变化导致稳定性相关的问题; 缺点:缺乏针对定时任务漏执行配套的监控设施;-- 自动建表存储过程DELIMITER $$CREATE PROCEDURE `P_AUTO_CREATE_TABLE`()BEGIN set @t_test1 = "CREATE TABLE `t_test1_${month}` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `addTime` int(11) DEFAULT NULL COMMENT '添加时间', `updateTime` int(11) DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='测试表1'"; set @t_test2 = "CREATE TABLE `t_test2_${month}` ( `id` ...