一、innodb基本的行级锁和表级锁

所有文章

https://www.cnblogs.com/lay2017/p/12078232.html

正文

innodb是mysql在oltp模式中最常用的一种执行引擎。本文将了解一下innodb基础的行级锁和表级锁。

首先,锁存在的理由是什么?是因为资源争抢,当多线程并发的时候,为了保证资源不被破坏,需要对资源的调用情况进行控制,比如该阻塞排队(互斥)的时候,该并行查询的时候(共享)。

innodb主要分为两种锁模式

1)行级锁,行级锁又再细分为

  1-1)共享锁,也称为S锁:IS锁允许多个事务去读取同一行数据,阻止其它事务获得X锁更新同一行数据。简单来说,读读不互斥、读写互斥。

  1-2)排它锁,也称为X锁:只允许获得X锁的事务更新数据,阻止其它事务获取S锁和X锁,也就是不能读也不能更新。简单来说,读写互斥,写写互斥。

2)表级锁,表级锁又再细分为

  2-1)意向共享锁,也称为IS锁:事务打算给数据行加S锁,就先取得表的IS锁。简单来说,就是先获取整张表的全局锁(IS),然后再给每条数据加行锁(S锁)。

  2-2)意向排它锁,也称为IX锁:事务打算给数据行加X锁,就先取得表的IX锁。简单来说,就是先获取整张表的全局锁(IX),然后再给每条数据加行锁(X锁)。

行锁和表锁的兼容情况

  锁模式 互斥锁(X) 意向互斥锁(IX) 共享锁(S) 意向共享锁(IS)
锁模式 是否兼容        
互斥锁(X)   冲突 冲突 冲突 冲突
意向互斥锁(IX)   冲突 兼容 冲突 兼容
共享锁(S)   冲突 冲突 兼容 兼容
意向共享锁(IS)   冲突 兼容 兼容 兼容

如果一个事务请求的锁与当前的锁兼容,那么innodb就将请求的锁授予该事务。否则,就得等待锁的释放。

总结

innodb分为行级锁和表级锁。两者又再细分为了S锁、X锁和IS锁、IX锁,它们之间相互兼容情况如上表所示。

参考链接:https://zhuanlan.zhihu.com/p/29150809

原文地址:https://www.cnblogs.com/lay2017/p/12230563.html

时间: 2024-10-29 06:57:45

一、innodb基本的行级锁和表级锁的相关文章

MySQL行级锁、表级锁、页级锁详细介绍

原文链接:http://www.jb51.net/article/50047.htm 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作.如果你是写锁,则其它进程则读也不允许行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作.页级,表级锁速度快,但冲突多,行级冲突少,但速度慢.所以取了折衷的页级,一次锁定相邻的一组记

悲观锁、乐观锁、行级锁、表级锁

1. 悲观锁(加的是表级锁) 一方:查询语句加 for update;另一方:查询语句加 for update; 当进行更新语句的时候,另一方不能进行更新操作 2. 乐观锁 更新语句设置版本号,在指定版本中更新数据 一方:update account set money=money-200,version=version+1 where id=1 and version=0; 另一方同时操作同一个版本号,则不能更新数据 另一方:update account set money=money+200

oracle的行级锁与表级锁

1.在操作DML(create,insert,update)语句时,oracle会自动加上行级锁,在select * from table for update [of column][nowait|wait 3]时,oracle也会自动加锁 建议(1)一般在for update 时加nowait,这样就不用等待其他事务执行了,一判断有事务,立马抛出错误. 建议(2)一般的of column都是在多表操作的时候,能锁定其中一个表的某些列,如果还是同一张表的话,并不能锁定某些列 2.表级锁 表级锁

3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束

 1 连接MYSQL服务器:mysql–uroot –p123456 查看中文问题 show variables like 'character%'; 2 修改mysql的字符集,退出mysql提示符界面: mysql -uroot -p--default_character_set=gbk; 3  数据库的操作:创建,查看,修改,删除 *创建: 创建一个名称为mydb1的数据库. createdatabase mydb1; 创建一个使用utf-8字符集的mydb2数据库. create d

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的

MySQL行级锁,表级锁,页级锁详解

页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作.如果你是写锁,则其它进程则读也不允许 行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作. 页级,表级锁速度快,但冲突多,行级冲突少,但速度慢.所以取了折衷的页级,一次锁定相邻的一组记录. MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BD

mysql基础--锁机制,表级锁,行级锁

一.表级锁 1.读锁,lock table t_student read;添加了读锁,使得其他sessionA和sessionB都不能修改数据,仅仅可以读数据. show processlist;查看进程,修改的时候状态是在等待表级锁,已经等待了8s 在解锁unlock tables;之后,修改数据的sql也执行成功,如下图所示 2.写锁,当某一个进程在对某一张表实施写锁后,在该进程如果完成了更新(写.insert.update.delete)之后,如果不释放写锁,其他的进程连查看这张表的权限都

Mysql 的表级锁和行级锁

表级锁 MySQL表级锁分为读锁和写锁. 读锁 用法:LOCK TABLE table_name [ AS alias_name ] READ 释放锁使用UNLOCK tables.可以为表使用别名,如果一旦使用别名在使用的时候也必须采用别名.成功申请读锁的前提是当前没有线程对该表使用写锁,否则该语句会被阻塞.申请读锁成功后,其他线程也可以对该表进行读操作,但不允许有线程对其进行写操作,就算是当前线程也不允许.当锁住了A表之后,就只能对A表进行读操作,对其他表进行读操作会出现错误(tablena

【转】MySQL中的行级锁,表级锁,页级锁

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁 和 排他锁. 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲