多个会话对表加表级读锁和表级写锁后的操作权限分析(表级读锁+表级写锁)

【0】README: 不论是加读锁还是写锁,必须要等到其他数据库连接关闭后才可以进行; 

【1】添加表级读锁

1.1)多会话执行的时序操作分析:

 

1.2)session1执行的具体时序操作;

mysql> select * from book_tbl;
+---------+------+-----------+-------+
| rcrd_id | isbn | book_name | price |
+---------+------+-----------+-------+
|       1 | 1001 | 红楼梦    |    30 |
|       2 | 1002 | 西游记    |    60 |
+---------+------+-----------+-------+
2 rows in set (0.01 sec)mysql>
mysql> lock table book_tbl read;
Query OK, 0 rows affected (0.00 sec)mysql> select * from book_tbl;
+---------+------+-----------+-------+
| rcrd_id | isbn | book_name | price |
+---------+------+-----------+-------+
|       1 | 1001 | 红楼梦    |    30 |
|       2 | 1002 | 西游记    |    60 |
+---------+------+-----------+-------+
2 rows in set (0.00 sec)mysql> update book_tbl set isbn='1003' where id=2;
ERROR 1054 (42S22): Unknown column 'id' in 'where clause'
mysql> update book_tbl set isbn='1003' where rcrd_id=2;
ERROR 1099 (HY000): Table 'book_tbl' was locked with a READ lock and can't be updated
mysql>
mysql>
mysql> update book_tbl set isbn='1003' where rcrd_id=2;
ERROR 1099 (HY000): Table 'book_tbl' was locked with a READ lock and can't be updated
mysql>
mysql> select * from mylock_tbl;
ERROR 1100 (HY000): Table 'mylock_tbl' was not locked with LOCK TABLES
mysql>
mysql>
mysql>
mysql>
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

1.3)session2执行的具体时序操作;

mysql> select * from book_tbl;
+---------+------+-----------+-------+
| rcrd_id | isbn | book_name | price |
+---------+------+-----------+-------+
|       1 | 1001 | 红楼梦    |    30 |
|       2 | 1002 | 西游记    |    60 |
+---------+------+-----------+-------+
2 rows in set (0.00 sec)mysql> update book_tbl set isbn='1003' where rcrd_id=2;
^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
mysql>
mysql> select * from mylock_tbl;
+---------+------+
| rcrd_id | name |
+---------+------+
|       1 | a    |
|       2 | b    |
|       3 | c    |
|       4 | d    |
|       5 | e    |
+---------+------+
5 rows in set (0.00 sec)mysql>
mysql> update book_tbl set isbn='1003' where rcrd_id=2;
Query OK, 1 row affected (7.68 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from book_tbl;
+---------+------+-----------+-------+
| rcrd_id | isbn | book_name | price |
+---------+------+-----------+-------+
|       1 | 1001 | 红楼梦    |    30 |
|       2 | 1003 | 西游记    |    60 |
+---------+------+-----------+-------+
2 rows in set (0.00 sec)

==================================================================

【2】添加表级写锁

(session1)

 

(session2)

【总结】 

  • 总结1:读锁不会阻塞读,但阻塞写; 写锁会把读和写都阻塞;
  • 总结2: 看看哪些表被加锁 了? show open tables;

【如何分析表锁定?】
可以通过检查 table_locks_waited 和 table_locks_immediate 状态变量来分析系统上的表锁定; 
show status like 'table%';

mysql> show status like 'table%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Table_locks_immediate      | 267   |
| Table_locks_waited         | 0     |
| Table_open_cache_hits      | 126   |
| Table_open_cache_misses    | 29    |
| Table_open_cache_overflows | 0     |
+----------------------------+-------+

这里有两个状态变量记录 mysql内部表级锁定的情况,两个变量 table_locks_immediate 和  table_locks_waited 说明如下:

  • table_locks_immediate: 产生表级锁定的次数,表示可以立即获取锁的查询次数,每获取锁,则值加1;
  • table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取等待锁的次数,而是每等待一次则加1),此值高则说明存在较严重的表级锁争用问题;

【补充】

  • 表锁1: myisam存储引擎 的读写锁调度是写优先, 这也是 myisam 不适合做写为主的引擎。因为写锁后,其他线程不能对其做任何操作,大量的更新会使得查询很难得到锁,从而造成永远的阻塞;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何写登录验证

如何写登录验证 开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.05.12我们都知道很多网站都会有登录的界面,目的就是要验证你的账号是否正确,不正确就不能登录,这样就能防止有其他目的的…

关于Java序列化你应该知道的一切

转载自 关于Java序列化你应该知道的一切 什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。 Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通…

mysql事务基础+基于innodb的行锁+间隙锁+如何锁定行

【0】README outlines are as follows : 行锁;事务;隔离级别;行锁变表锁;间隙锁;如何锁定一行;行锁总结; 【1】行锁事务存储引擎基础 1、行锁: 偏向于 innodb 存储引擎&#xff0c…

页面跳转、嵌套

页面跳转、嵌套 开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.05.16在日常浏览网页的时候,我们常常能看到很多不同样式的网页,其中我们用的最多的应该就是跳转了,点击链接跳转、点击按…

Java高级进阶:自定义ClassLoader

转载自 Java高级进阶:自定义ClassLoader 假如我们的类不在classpath下,而我们又想读取一个自定义的目录下的class,如果做呢? 读取自定义目录的类 示例读取c:/test/com/test.jdk/Key.class这个类。 package com.test.jdk;public…

mysql如何分析sql执行效率和进行效率优化

【0】如何分析mysql中sql执行较慢的问题 步骤1、观察,至少跑一天,看看生产的慢sql情况;步骤2、开启慢查询日志,设置阈值,比如超过5秒钟就是慢sql, 并将它抓取出来;步骤3、explain慢sql分析&…

如何把模型表导入数据库

开发工具与关键技术:Power Designer、SQL 作者:幻奏 撰写时间:2019.05.23事先说明,我只是一个小萌新,我分享的文章是我在学习过程中学到的,不代表全是正确的,所以我要是有什么地方说错了&#x…

解决eclipse中tomcat无法识别maven web项目问题

eclipse工具中导入了maven web项目, 但是tomcat死活都识别不了, maven项目进行了clean install等操作, 但是仍无效, 后在网上搜索到以下答案, 解决问题 1. 右击项目 -> Debug As -> Maven build... 2. 在Goals中填入: -Dwtpversion2.0 eclipse:eclipse 对于WTP(Web Tool…

深入理解CAS算法原理

转载自 深入理解CAS算法原理1、什么是CAS?CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同…

如何写登录的记住账号

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.05.27上次我把如何登录的代码给写了,却没有写如何记住登录的账号密码,所以现在我就简单的写一下是如何记住账号密码的。 如果我们没写记住密码的话&am…

严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis

博主 使用Eclipse 下的Mavn搭建的SSM框架的工程,出现以下错误 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener Java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoad…

java高级应用:线程池全面解析

转载自 java高级应用:线程池全面解析 什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复…

如何用for循环出数据库的数据

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.5.30在客房管理的系统中有很多不同的小格子,它们分别代表了不同的房间,可以动态的显示每间房间的状态,这个就是房态图。有很多系统应该都有…

Maven常见问题之【-Dmaven.multiModuleProjectDirctory system property is not set】

配置jdk时,声明vm参数,如下, 且需要保证 M2_HOME 环境变量已经配置了, 如下: C:\Users\pacoson>echo %M2_HOME% D:\software_cluster\apache-maven-3.3.9 -Dmaven.multiModuleProjectDirectory$M2_HOME

实现java多线程的3种方式,99%人没用过第3种

转载自 实现java多线程的3种方式,99%人没用过第3种 实现多线程的3种方式 1、继承Thread类 看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程。 继承Thread类耦合性太强了…

关于时间类型的问题

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.6.2我在做项目的时候遇到了一个问题,我要把时间显示到表格上,然后我像平常那样写,linq查询,然后返回数据,然后加载…

maven项目不编译xml文件

最近在搭建一个mavenspringMVCmybatis的项目&#xff0c;编译的时候mybatis生成的**Mapper.xml文件总是不编译&#xff08;classes文件夹内没有出现&#xff09;。 解决方法是在maven的pom.xml文件夹<build>标签下增加如下代码&#xff08;build标签的父标签是 project标…

多线程并发神器--ThreadLocal

转载自 多线程并发神器--ThreadLocal什么是ThreadLocal可以理解成线程本地变量&#xff0c;传统的线程对一个变量操作时操作的是同一个对象&#xff0c;也存在线程安全的问题。ThreadLocal是一个变量的本地副本&#xff0c;线程对变量的操作不会影响其他线程。首先看看ThreadLo…

如何获取复选框的值

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.6.7我们在很多地方都用到了复选框&#xff0c;数据表格里也有复选框&#xff0c;新增数据时也可能要复选框&#xff0c;修改时也要回填复选框&#xff0c;所以我们用到的地方…

使用log4j2打印mybatis的sql执行日志

【1】maven配置jar包依赖&#xff0c; 如下&#xff1a; <!-- 日志jar --><!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-…