mysql锁

Mysql锁

痴心易碎 提交于 2020-02-01 11:38:49
Mysql有三种锁:表锁(偏读)、行锁(偏写)、页锁 1. 查看锁命令 1.1 查看锁 show open tables ; In_use为0表示没有被锁 1.2 分析表锁定 show status like '%table%' Table_locks_immediate:产生表级锁定的次数(锁的查询次数)。 Table_locks_waited:出现表级锁定争用而发生等待的次数,此值高说明存在严重表级锁争用情况。 2. 表锁 2.1 读锁(共享锁) Session 1 为Table增加 读锁 之后: Session 1 只能读锁定表,不能读其他表,写锁定表 报错 。 Session 2 可以读任何表,写锁定表 阻塞 。 2.2 写锁(独占锁) Session 1 为Table增加 写锁 之后: Session 1 可以做锁定表进行任何操作 Session 2 无法对锁定表进行任何操作 2.3 相关命令 加读锁 lock table 表名 1 read , 表名 2 read ; 加写锁 lock table 表名 1 read , 表名 2 read ; 解锁 unlock tables ; 3. 行锁 3.1 开启事务即开启了行锁 提交事务之前,其它会话查询到的都是未提交的数据,如果更新了同一行,会被阻塞,直到这个事务被提交。 set autocommit = 0 ;

MySql之深入分析MySql 的锁

时光毁灭记忆、已成空白 提交于 2020-01-31 11:21:47
文章目录 1.InnoDB 存储引擎的锁 1.1.锁的类型 -八中类型 1.2.锁的基本模式 1.2.1.表锁 1.2.2.行锁 1.2.3.关于行锁和表锁的粒度概述 1.3.锁的类型 1.3.1.Shared Locks (共享锁) ----->行级别的锁 1.3.1.1.概念 1.3.1.2.如何设置共享锁 1.3.1.2.如何释放共享锁 1.3.1.3.案例1-查询加锁后查询 1.3.1.3.案例2-查询加锁后更新 1.3.2.Exclusive Locks(排它锁)又称写锁或者X锁 ----->行级别的锁 1.3.2.1.概念 1.3.2.2.如何设置排它锁 自动加锁 delete/update/insert 手动加锁 FOR UPDATE 1.3.2.3.如何释放排它锁 commit/rollback; 1.3.2.3.案例演示 1.3.3.意向锁 1.3.3.1.概念 1.3.3.1.如何设置意向锁 1.3.3.2.意向锁的意义 1.3.3.3.意向锁使用场景 1.3.3.4.案例演示- 行锁之后进行表锁试验 1.3.3.5.案例演示- 表锁之后进行行锁试验 1.3.3.6.解锁 1.4. 数据准备 SET NAMES utf8mb4 ; SET FOREIGN_KEY_CHECKS = 0 ; -- -- -- -- -- -- -- -- -- -- -- -- -

mysql 高级 数据库锁

若如初见. 提交于 2020-01-29 13:03:57
是什么? 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源的征用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库极为重要。 锁的分类: 从对数据库操作的类型(读|写)分 *读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。 *写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁 从对数据库操作的粒度分: 表锁 | 行锁 表锁(偏读) 特点 :偏向MYISAM存储引擎,开销小,加锁快:锁定粒度大。发生锁冲突概率最高,并发度低。 给表添加锁和解锁 : 行锁(偏写) 特点 :偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率最低,并发度也最高。 InnoDB与MYISAM的最大不同有两点:一是支持事务;二是采用行级锁 ***帅气的远远啊*** 来源: CSDN 作者: yuanyuan啊 链接: https://blog.csdn.net/qq_41585840/article/details/104104595

mysql的锁

扶醉桌前 提交于 2020-01-28 19:16:22
mysql的锁 一、锁的分类: 锁粒度: 表级锁 (mysam) 行级锁 (innodb) 用途: 读锁:共享锁,只读不可写(包括当前事务,当前会话中的其他表不可以更新、) ,多个读互不阻塞 写锁:独占锁,排它锁,写锁会阻塞其它事务(不包括当前事务)的读和它锁 实现 : 存储引擎:自行实现其锁策略和锁粒度 服务器级:实现了锁,表级锁,用户可显式 请求分类: 隐式锁:由存储引擎自动施加锁 显式锁:用户手动请求 二、锁的策略 ​ 在锁粒度及数据安全性寻求的平衡机制 三、锁的使用示例 3.1 显式使用锁 3.1.1 表锁: 加锁 LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] … lock_type: READ , WRITE Database changed MariaDB [ hellodb ] > lock table students read ; Query OK , 0 rows affected ( 0.00 sec ) MariaDB [ hellodb ] > grant all privileges on hellodb . * to 'a' @' 192.168 . % ' identified by ' a '; ERROR 1100 (HY000):

MySQL 事务与锁详解

吃可爱长大的小学妹 提交于 2020-01-27 17:15:22
1 什么是数据库的事务? 1.1 事务的典型场景 比如下单,会操作订单表,资金表,物流表等等,这个时候我们需要让这些操作都 在一个事务里面完成。在金融的系统里面事务配置是很常见的,比如行内转账的这种操 作,如果我们把它简单地理解为一个账户的余额增加,另一个账户的余额减少的情况(当 然实际上要比这复杂),那么这两个动作一定是同时成功或者同时失败的。 1.2 事务的定义 维基百科的定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由 一个有限的数据库操作序列构成。 这里面有两个关键点, 第一个,它是数据库最小的工作单元,是不可以再分的。 第二个,它可能包含了一个或者一系列的 DML 语句,包括 insert delete update。 1.3 哪些存储引擎支持事务 InnoDB 支持事务,这个也是它成为默认的存储引擎的一个重要原因: https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html 另一个是 NDB。 1.4 事务的四大特性 第一个,原子性,Atomicity,也就是我们刚才说的不可再分,也就意味着我们对数 据库的一系列的操作,要么都是成功,要么都是失败,不可能出现部分成功或者部分失 败的情况,以刚才提到的转账的场景为例,一个账户的余额减少,对应一个账户的增加, 这两个一定是同时成功或者同时失败的。

mysql锁

こ雲淡風輕ζ 提交于 2020-01-24 22:41:23
文章目录 锁 一、全局锁 二、表锁 三、行锁 锁 一、全局锁 Flush tables with read lock;当前客户端断开连接时候,锁就会去除; 二、表锁 lock tables t1 read,t2 wirte; 这个语句,则其他线程写t1、读写t2的语句都会被阻塞。同时,线程A在执行unlock tables之前,也只能执行读t1、读写t2的操作 如果安全地给小表加字段? 首先要解决长事务,事务不提交,就会一直占着DML锁。在MySQL的information_schema库的innodb_trx表中,可以查到当前执行的事务。如果要做DDL变更的表刚好有长事务在执行,要考虑先暂停DDL,或者kill掉这个长事务 如果要变更的表是一个热点表,虽然数据量不大,但是上面的请求很频繁,而又不得不加个字段,该怎么做? 在alter table语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后再通过重试命令重复这个过程 三、行锁 1.MySQL的行锁是在引擎层由各个引擎自己实现的。但不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁 2.行锁就是针对数据表中行记录的锁。比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新 两阶段锁 在一个事务里面,分为加锁(lock

mysql锁之Next-Key Locks

巧了我就是萌 提交于 2020-01-24 14:44:43
一个Next-key锁结合了行锁和gap锁。 InnoDB执行一个行级别锁在这样的一个途径,那就是它搜索或者扫描一个表索引时,它设置共享或者独占锁在它遭遇的索引记录上。于是,行级锁是真实的行记录锁。一个next-key锁在一个行记录上总是这个行记录前的间隙。这就是一个next-key是一个索引记录锁加上一个在这个记录前的间隙锁。如果一个会话有一个共享锁或者一个独占锁在一个索引的记录R上,另外的会话不能插入一个新索引记录在R前的间隙。 猜测一个索引包含10,11,13,20。可能这个索引的next-key锁盖以下间隔,这个间隔在一个圆括号表示的排除节点符号和一个方括号表示包含节点符号。 看这个最后的间隔,next-key锁锁定在索引中上面的最大值和一个“临界值”伪记录,这个伪记录有一个比任何实际值都高的值,这个伪记录不是真实的记录,因此,在这个影响下,这个next-key锁仅仅锁了跟随在最大索引值的间隙。 默认情况下,InnoDB操作在可重复度事务隔离级别,在这个案例,InnoDB使用next-key为查找和索引扫描锁定,防止phantom(幻影)行的出现。 事务数据为一个next-key锁展现到跟随在下面语句的输出: 来源: https://www.cnblogs.com/ck0074451665/p/10266142.html

MySQL之行锁

心已入冬 提交于 2020-01-15 23:19:55
前言   本章介绍行锁的相关知识。 行锁 偏向 InnoDB 存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高。 准备   1. 创建表tb_innodb_lock,注意数据库引擎为 InnoDB 。 CREATE TABLE test_innodb_lock ( a INT (11), b VARCHAR (20) ) ENGINE INNODB DEFAULT charset = utf8; insert into test_innodb_lock values (1,'a'); insert into test_innodb_lock values (2,'b'); insert into test_innodb_lock values (3,'c'); insert into test_innodb_lock values (4,'d'); insert into test_innodb_lock values (5,'e');    2.创建索引。 create index idx_lock_a on test_innodb_lock(a); create index idx_lock_a on test_innodb_lock(b); 1.行锁定基本演示 1.打开A、B另个会话,并关闭数据库的自动提交。 set autocommit=0;

Redis入门——4.Redis事务及锁应用

一个人想着一个人 提交于 2020-01-15 23:05:14
Redis事务及锁应用 一,事务的应用 事务: 即逻辑上的一组操作,要么全部成功,要么全部失败。 参考mysql中的事务,redis为了处理实际业务同样提供了事务操作,下面我们参照mysql中的事务学习redis事务。 MySQL Redis 开启事务 begin multi 语句/命令 sql语句 普通命令 失败 rollback 回滚 discard 取消 关闭事务 commit exec 通过比较我们可以看到redis的事务命令,我们先参照mysql中的事务 模拟tom给jerry转账业务 begin; update account set money=money-1000 where username='tom'; update account set money=money+1000 where username='jerry'; commit; redis事务 启动事务 multi 回滚事务,在redis中准确的说是取消事务。而不是回滚事务 discard 提交事务 exec 案例 模拟tom给jerry转账业务 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tom 300 QUEUED 127.0.0.1:6379> set jerry 300 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK

mysql乐观锁总结和实践

百般思念 提交于 2020-01-15 22:26:15
转载于: https://www.iteye.com/blog/chenzhou123520-1863407 上一篇文章《MySQL悲观锁总结和实践》谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受。所以与悲观锁相对的,我们有了乐观锁,具体参见下面介绍: 乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有以下2种方式: 1.使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对