1.引入
我们在之前的线程中,已经初步接触到了锁的一些相关的内容。那么当时的我们使用售票为例子,列举了在只剩一张票的时候计算机程序在实现购票中不加锁出现的各种问题。当我们再线程中加了锁以后,就可以保证计算机对这一个数据的争抢一个有序的处理。那么在MySQL数据库中。我们同样需要学习数据库的锁机制来解决一些相关的问题。
2.MySQL数据库锁概述
数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。
3.数据库锁的分类
按照对数据的操作类型来分,可以分为读锁和写锁。
读锁:所谓的读锁,也叫共享锁。针对同一份数据,多个读操作可以同时进行而不会相互影响。
写锁:所谓的写锁,也叫排他锁。当前写操作没有完成之前,它会阻断其他锁的和读锁。
按照对数据操作的粒度来分,可以分为表锁和行锁以及页锁。
4.锁的添加和移除
(1).创建测试数据库表:amdin
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=myisam DEFAULT CHARSET=utf8;
//注意这一个数据表的引擎是myisam
创建好的数据库表结构如下:
(2).为了方便测试,我们创建俩个数据库会话
(3).手动添加锁(加读锁或者是表锁)
先看看表上面加过的锁。
show open tables;
通过上面的命令,我们可以看见In_use的值都是0.这就是表明数据库表没有锁过。
手动添加表锁,给admin表添加一个读锁,这样我们的admin就可以共享数据。格式如下:
lock table 表名称1 read(write),表名称2 read(write),...
既然我们可以给我们的数据库表加锁,那么我们当然也可以把我们加的锁去掉,指令如下:
unlock tables;
5.读锁案例讲解
(1).给表添加一个读锁
(2).操作测试
A:查询操作
会话1对数据表进行查询操作
会话2进行查询操作
发现无论会话1还是会话2,都可以进行数据库读锁表的查询操作。
B.修改操作
会话1进行修改操作
发现,在锁表的情况下,不可以对表进行修改操作。
会话2进行数据库表的修改操作
发现,会话2的修改操作一直处于阻塞的状态。,然后我们在会话1把数据库表的锁解锁以后,发现会话2立刻执行。
C:加了锁的情况俩个会话是否可以去读其他表的数据内容
会话1读取其他的表内容
发现:无法读取其他数据库表的内容。
会话2读取其他数据表的内容
发现,可以读取其他表的数据内容。