MYSQL进阶学习笔记九:MySQL MyISAM的表锁!(视频序号:进阶_18)

知识点九:MySQL MyISAM表锁(共享读锁)(18)

为什么会有锁:

  打个比方,我们到淘宝买一件商品,商品只有一件库存,这时候如果还有另外一个人也在买,那么如何解决是你买到还是另一个人买到的问题?

    我们先从库存表中取出物品的数量,然后插入订单,付款后插入付款表信息,然后更新商品数量。在这个情况过程中,使用锁可以对有限的资源进行保护,解决隔离和并发的矛盾!

锁的概念:

  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的

    一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度说,锁对数据库而言显得尤其重要,也更加复杂。

MySQL锁的概述:

  相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

    比如:MyISAM和MEMORY存储引擎采用的是表级锁(table- leavel locking);;

      BOD存储引擎采用的是页面锁(page- leavel locking);

      InnoDB存储引擎既支持行级锁(row-leavel locking),也支持表级锁,但默认情况下采用行级锁。

   

MySQL这三种锁的特性可大致归纳如下:

锁名称

开销

加锁速度

死锁

粒度

并发性能

表级锁

开销小

加锁快

不会出现死锁

锁定粒度大

发生锁冲突的概率最高,并发度最低

行级锁

开销大

加速慢

会出现死锁

锁定粒度最小

发生锁冲突的概率最低,并发度也最高

页面锁

开销和加锁时间界于表锁与行锁之间

会出现死锁

锁定粒度界于表锁和行锁之间

并发度一般

    仅从锁的角度来说:

      表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如WEB应用;

      而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

      从上述特点可见,很难笼统地说哪些锁更好,只能就具体应用的特点来说哪种锁更合适。

 

  1.MyISAM表锁:

    MySQL的表级锁有两种模式:表共享度锁(Table Read Lock)和表独占写锁(Table Write Lock)

MySQL中的表锁兼容性

请求锁模式

    是否兼容

当前锁模式

 

None

 

读锁

 

写锁

度锁

写锁

 

    给表加锁:

    1. 加共享读锁:lock table 表名 read
    2. 表独占写锁:lock table 表名 read

    解锁:

        unlock tables;

    查看表中有什么样的等待:

        SHOW VARIABLES LIKE '%table%';

    查看锁的状态:

        SHOW STATUS LIKE '%table%';

    查看表级锁的争用情况:

        Table_locks_waited:越低越好

 1 --把mzjj数据库到处并且添加到test_myisam
 2 mysqldump -uroot -p --default-character-set=utf8 -d mzjj>D:/cc.sql        --导出表信息
 3 mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=utf8 mzjj>D:/cc1.sql    --导出表内容    
 4 CTRATE DATABASE test_myisam        --创建数据库
 5 mysql -uroot -p test_myisam<D:/cc.sql        --导入表信息
 6 mysql -uroot -p test_myisam<D:/cc1.sql        --导入表内容
 7 
 8 --一客户端
 9 LOCK TABLE employees read10  --二客户端
11 UPDATE employees SET first_name='yu' WHERE emp_no=1001;
12 --一客户端
13 UNLOCK TABLES;
14 
15 
16 --二客户端
17 LOCK TABLE employees read18 --一客户端
19 INSERT INTO employees VALUES(1002,'1991-1-4','ty','io','M','2014-1-1');
20 
21 SHOW VARIABLES LIKE '%table%';
22 SHOW STATUS LIKE '%table%';
23 --二客户端
24 UNLOCK TABLES;
共享读锁测试

猜你喜欢

转载自www.cnblogs.com/darwinli/p/9047366.html