MyISAM锁 与 INNODB锁

2024-08-22 21:38
文章标签 innodb myisam

本文主要是介绍MyISAM锁 与 INNODB锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文双引号内容为重要点 ,在markdown中双引号的内容为红色

一 MyISAM锁

表锁

表锁:不会出现死锁,容易发生锁冲突,并发低(1) 表锁的两种模式: "表共享锁 (Table Read Lock)" 和 "表独占写锁 (Table Write Lock)"注: 共享锁,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;独占写锁,则会阻塞其他用户对同一表的读和写请求;读操作和写操作之间,以及写操作之间是串行的;"当一线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。"(2) 如何加锁:MyISAM在sql查询时会将涉及到的表加上读锁,在执行插入或更新时会加写锁。用户也可以用LOCK TABLE去显式的加锁。示例:LOCK tables orders read local,order_detail read local;   加锁SELECT SUM(total) FROM orders;SELECT SUM(subtotal) FROM order_detail;UNLOCK tables;                                           解锁"local"选项作用是满足MYISAM并发插入条件的情况下,允许其他用户在表尾插入记录,若不加"local"选项,则不允许。注:显式的加锁一般是应用于:需要在一个时间点实现多个表的一致性读取。不然的话,可能读第一个表时,其他表由于还没进行读操作,
没有自动加锁,可能数据会发生改变。并且显示加锁后只能访问加锁的表,不能访问其他表。

并发锁

    并发锁:在一定条件下MYISAM支持查询与插入并发执行条件:MYISAM引擎系统变量concurrent_insert值:0 不允许并发插入1 进程在读取表的时候允许另一个进程在表尾插入记录, MySQL默认设置2 无论MYISAM表中有没有空洞,都允许在表尾插入记录,也允许并发插入记录表    空洞:指表中的数据出现断层

锁的调度情况

默认情况:MyISAM存储引擎的读和写锁是互斥,读操作是串行的。在没有做任何调整的情况下,写进程会比读进程优先获得锁,即使读进程优先于写进程请求。大量的更新操作会造成查询操作很难获取到读锁,从而导致永远阻塞情况。"MySQL认为写请求一般比读请求重要"调整方式:通过"low-priority-updates" 参数,使MyISAM引擎默认给予读请求以优先的权利。通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级

二 INNODB锁

行锁

行锁:会出现死锁,发生锁冲突几率低,并发高"mysql的行锁是通过索引加载的,要是对了的sql语句没有走索引,则会全表扫描,行锁无法实现,取而代之的是表锁。"(1) 行锁的两种模式: "共享锁(S)" 和 "排他锁(X)"注:共享锁(S):当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。排它锁(X):当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁,这两种"意向锁都是表锁"。衍生:意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。示例:select math from zje where math > 60 "lock in share mode";  共享锁select math from zje where math > 60 "for update";          排他锁重点:1.行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。2.两个事务不能锁同一个索引。示例:事务A先执行:select math from zje where math > 60 for update;事务B再执行:select math from zje where math < 60 for update;这样的话,事务B是会阻塞的。如果事务B把 math索引换成其他索引就不会阻塞。但注意,换成其他索引锁住的行不能和math索引锁住的行有重复。3.insert ,delete , update在事务中都会自动默认加上排它锁。

锁冲突

示例:事务A将某几行上锁后,事务B又对其上锁,锁不能共存否则会出现锁冲突。(但是共享锁可以共存,共享锁和排它锁不能共存,排它锁和排他锁也不可以)

死锁

示例:两个事务,事务A锁住了1~5行,同时事务B锁住了6~10行,此时事务A请求锁住6~10行,就会阻塞直到事务B施放6~10行的锁,
而随后事务B又请求锁住1~5行,事务B也阻塞直到事务A释放1~5行的锁。死锁发生时,会产生Deadlock错误。

问题

为什么表锁不会产生死锁?
答:锁对表进行操作,将全表锁住之后自然就不会产生死锁

乐观锁

    操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突。"(一般都需要自己去实现)"示例:下单操作包括3步骤:1.查询出商品信息select (status,status,"version") from t_goods where id=#{id}2.根据商品信息生成订单3.修改商品status为2update t_goods set status=2,version=version+1where id=#{id} and "version=#{version}";注:实现乐观锁与实例中的红色字体相关

悲观锁

    操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,
这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。"共享锁和排它锁是悲观锁的不同的实现"

这篇关于MyISAM锁 与 INNODB锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097470

相关文章

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

MySQL技术内幕_innodb存储引擎

MySQL技术内幕_innodb存储引擎 INNODB innodb中如果表没有主键 表是否由 非空唯一键,有则该字段为主键没有,则自动创建一个6字节大小的指针 innodb存储引擎的所有数据都存储在表空间中,表空间由段,区,页(块)组成。 如果启用了 innodb_file_per_table, 则每张表内的数据可以单独放在一个表空间中即使启用了上面参数,共享表空间也会因为 系统事务信息

Mysql中的隐式COMMIT以及Savepoints的作用以及MySQL的Innodb分空间存储、设计优化、索引等几个小知识点整理

一、Mysql中的隐式COMMIT以及Savepoints的作用     Mysql默认是自动提交的,如果要开启使用事务,首先要关闭自动提交后START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务。但即使如此,也并不是所有的操作都能被ROLLBACK,以下语句在执行后会导致回滚失效,比如DDL语句创建一个数据库,而且不止此,这样的语

MySQL Innodb 插入调优

1)提高数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作。这次修改了下面四个配置项:  1)将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。 0: Write the log buffer to the log file and flush the

MySql系列之Innodb存储引擎

插件化存储引擎是MySQL特点,用户可以根据自己的需求使用不同的存储引擎,甚至通过抽象的API接口实现自己的存储引擎。innodb存储引擎支持行级锁以及事务特性,也是多种场合使用较多的存储引擎,本文将介绍innodb存储引擎。 存储引擎简介 mysql系统来说,存储引擎是真正实现数据的存储与读取操作的对象,数据库实例通过抽象API接口与存储引擎交互,存储引擎自定义实现数据的物理、逻辑组织形式以

mysql5.6InnoDB通过frm与ibd对数据进行恢复

1. 安装MySQL Utilities 下载地址:https://dev.mysql.com/downloads/utilities/ 下载完后直接安装即可 如果运行时需要python就下载 https://dev.mysql.com/downloads/connector/python/ 本机还需要安装与需要恢复数据的一样版本的Mysql 2. 使用mysqlfrm命令读取frm

MySQL基础学习:为什么推荐使用InnoDB而不是MyISM

这里写自定义目录标题 一、事务支持二、锁机制三、外键支持四、性能和优化五、崩溃恢复能力六、其他特性 一、事务支持 InnoDB:支持事务处理,通过ACID(原子性、一致性、隔离性、持久性)事务模型保证数据的完整性和一致性。这对于需要保证数据一致性和可靠性的应用场景至关重要。MyISAM:不支持事务处理,这在进行大量数据修改时可能导致数据不一致的风险。 二、锁机制 InnoDB

mysql innodb分表实战

目的:为了了解mysql单表分区方法,特此作为学习笔记记录一下。 一。准备表,创建一个学生表,包含主键sid和名称sname字段 create table students( sid int(5) primary key, sname varchar(24) ); 二。准备数据 insert into students(sid,sname) values(10003,'tom

带你从根本理解mysql innodb的各种锁

锁的相关概念: 锁:数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。而锁就是并发控制的一个重要的手段。 表锁:对某个表进行加锁。能够保证不会出现死锁,但是发生锁冲突几率高,并发性能差。 排他锁(X):排他锁也叫“写锁”,获得某个表的排他锁的事务便拥有了对这个

Mysql InnoDB 的 隔离级别的实现

InnoDB 的 隔离级别的实现   InnoDB使用不同的锁定策略支持此处描述的每个事务隔离级别。 事务隔离是数据库处理的基础之一。隔离是缩写ACID中的I;隔离级别是一种设置,用于在多个事务同时进行更改和执行查询时微调性能与结果的可靠性,一致性和可重复性之间的平衡。 您可以在默认的REPEATABLE READ级别上实现高度的一致性,以实现对重要数据的操作(其中ACID遵从性很重要)。