首页 > 数据库 >Mysql 事务隔离机制、锁机制、MVCC多版本并发控制隔离机制、日志机制、

Mysql 事务隔离机制、锁机制、MVCC多版本并发控制隔离机制、日志机制、

时间:2023-03-30 18:58:00浏览次数:42  
标签:事务 隔离 lock Innodb Mysql 机制 日志 row

原子性 (Atomicity)当前事务的操作要么同时成功,要么同时失败。原子性由undo log日志来实现。
一致性 (Consistency) : 使用事务的最终目的,由其它3个特性以及业务代码正确逻辑来实现。
隔离性 (lsolation) : 在事务并发执行时,他们内部的操作不能互相干扰,隔离性由MySQL的各种锁以及MVCC机制来实现。
持久性 (Durability) : 一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来实现。

MVCC(Multi-Version Concurrency Control)多版本并发控制就可以做到读写不阻塞且避免了类似脏读这样的问题,主要通过undo日志链来实现。(undo 日志版本链在不同事务隔离级别基于可见性算法实现)。

select操作是快照读 (历史版本)

insert、update和delete是当前读 (当前版本)

read commit (读已提交),语句级快照

repeatable read (可重复读),事务级快照

序列化:本质是通过在select语句后面加了共享锁:lock in share mode;

大事务的影响

并发情况下,数据库连接池容易被撑爆;
锁定太多的数据,造成大量的阻塞和锁超时执行时间长,容易造成主从延迟;
回滚所需要的时间比较长;
undo log膨胀;
容易导致死锁;

事务优化实践原则

将查询等数据准备操作放到事务外

事务中避免远程调用,远程调用要设置超时,防止事务等待时间太久事务中避免一次性处理太多数据,可以拆分成多个事务分次处理

更新等涉及加锁的操作尽可能放在事务靠后的位置

能异步处理的尽量异步处理

应用侧(业务代码)保证数据一致性,非事务执行

事务问题定位

#查询执行时间超过1秒的事务,详细的定位问题方法后面讲完锁课程后会一起讲解
SELECT *
FROM
  information_schema.innodb_trx
WHERE
  TIME_TO_SEC( timediff( now( ),trx_started ) ) > 1;
#强制结束事务
kill 事务对应的线程id(就是上面语句查出结果里的trx_mysql_thread_id字段的值)

锁分类

乐观锁适合读操作更多的场景,悲观锁适合写操作较多的场景。

锁等待分析

通过检查InnoDB row lock状态变量来分析系统上的行锁的争夺情况。
show status like 'innodb_row_lock%';
对各个状态量的说明如下:
Innodb_row_lock_current_waits: 当前正在等待锁定的数量
Innodb_row_lock_time: 从系统启动到现在锁定总时间长度
Innodb_row_lock_time_avg: 每次等待所花平均时间
Innodb_row_lock_time_max: 从系统启动到现在等待最长的一次所花时间
Innodb_row_lock_waits: 系统启动后到现在总共等待的次数


对于这5个状态变量,比较重要的主要是:
Innodb_row_lock_time _avg (等待平均时长)
Innodb_row_lock_waits (等待总次数)
Innodb_row_lock_time (等待总时长)

间隙锁是在可重复读级别下才会生效

-- 查看事务
select * from INFORMATION SCHEMA.INNODB TRX;
-- 查看锁,8.0之后需要换成这张表data_locks
select * from INFORMATION SCHEMA.INNODB_LOCKS;
-- 查看锁等待8.0之后需要换成data_lock_waits
select * from INFORMATION SCHEMA.INNODB_LOCK_WAITS;

-- 查看锁等待详细信息
show engine innodb status;

锁优化实践

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
合理设计索引,尽量缩小锁的范围
尽可能减少检索条件范围,避免间隙锁
尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
尽可能用低的事务隔离级别

sql执行流程:

 

 WAL:Write-Ahead Logging 磁盘文件预写机制。

 

标签:事务,隔离,lock,Innodb,Mysql,机制,日志,row
From: https://www.cnblogs.com/zhf123/p/17273979.html

相关文章

  • 实战SQL优化(以MySQL深分页为例)
    1准备表结构CREATETABLE`student`(`id`intNOTNULLAUTO_INCREMENT,`user_no`varchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNULLDEFAULTNULL,`user_name`varchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNULLDEFAULTNULL......
  • MySQL常用命令
    常用命令:https://blog.csdn.net/qq_38328378/article/details/80858073最详细的:https://blog.csdn.net/qq_34115899/article/details/81190461......
  • MySQL数据库怎么创建表?MySQL数据库基础知识
    MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。MySQL是一种关联数据库管理系统,关联数据库......
  • 22、MySQL主从复制详解及配置
    主从复制的介绍MySQL主从复制是指将一个MySQL服务器的数据复制到其他MySQL服务器上的过程。在主从复制中,一个MySQL服务器(称为“主服务器”或“主节点”)充当源,另一个或多个MySQL服务器(称为“从服务器”或“从节点”)充当目标。主服务器将更新和更改记录到二进制日志(binaryl......
  • 37、K8S-安全机制-CA、User、Cluster
    1、证书信息1.1、简介我们知道,通过kubeadm在创建集群的时候,其中有一步就是:生成kubernetes控制组件的kubeconfig文件及相关的启动配置文件,通过各种conf文件,让不同的组件具备操作相关资源的权限。1.2、位置master1~]#ll/etc/kubernetes/pki/-rw-r--r--1rootroot131......
  • MySQL、Redis和Elasticsearch比较
    MySQL是一种关系型数据库管理系统,它被广泛用于存储结构化数据。拥有极高的可靠性和安全性,支持ACID事务,并具有良好的扩展性,可以适应高并发访问的场景。Redis是一种内存......
  • MySql基本的简单sql语句
    SQL语句分类必须记住删除语句DELETEFROM表名WHERE条件插入语句简单的插入语句INSERTINTO表名(字段列表)VALUES(值列表)查询出的数据插入到已存在的表中查询出的数......
  • MySQL导入数据库1118错误解决方案[ERR] 1118 - Row size too large (> 8126). Changing
    MySQL导入数据库1118错误解决方案[ERR]1118-Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOB编辑sql文件,在开头设置一下innodb_strict_mode为0SE......
  • 36、K8S-安全机制-ServiceAccount(SA)
    1、基础知识1.1、场景基础1.1.1、应用场景对于任何一种应用场景,其权限的认证管理都是非常重要的,对于linux系统来说,selinux、防火墙、pam、sudo等等,其核心的目的都是为......
  • 拒绝“爆雷”!GaussDB(for MySQL)新上线了这个功能
    摘要:智能把控大数据量查询,防患系统奔溃于未然。本文分享自华为云社区《拒绝“爆雷”!GaussDB(forMySQL)新上线了这个功能》,作者:GaussDB数据库。什么是最大读取行一直以来,大......