你真的懂你真的懂Mysql的锁吗?详谈的锁吗?详谈Myql的锁机制的锁机制
锁的基本介绍锁的基本介绍
要说锁,应该追溯到操作系统中的多线程原理,锁机制在其中发挥着必不可少的作用,先抛出锁的定义
锁是计算机协调多个进程或线程并发访问某一资源的机制
在数据库中,除传统的计算资源(如计算资源(如CPU、、RAM、、I/O等)等)的争用以外,数据也是一种供许多的争用以外,数据也是一种供许多用户共享用户共享的资源。如何保证数据
并发访问的一致性、有效性一致性、有效性是所有数据库必须解决的一个问题,锁冲突锁冲突也是影响数据库并发访问性能的一个重要因素。从这个
角度来说,锁对数据库而言显得尤其重要,也更加复杂
相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎存储引擎支持不同的锁机制。比如,MyISAM和
MEMORY存储引擎采用的是表级锁表级锁(table-level locking);InnoDB存储引擎既支持行级锁(行级锁(row-level locking)),也支持表
级锁,但默认情况下是采用行级锁
关于InnoDB与MylSAM对锁及其他方面的对比,具体可以看我之前总结过的一张表
下面分别阐述下面分别阐述MYISAM的锁机制,我们通过案例来进行分析的锁机制,我们通过案例来进行分析
MyISAM表锁表锁
MySQL的表级锁有两种模式:表共享读锁(表共享读锁(Table Read Lock))和和表独占写锁(表独占写锁(Table Write Lock))
对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;即:读锁阻写不阻读
对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;即写锁六亲不认
MyISAM表的读操作与写操作之间,以及写操作之间是串行的,串行与并行是相对概念。
建表建表SQL
CREATE TABLE `mylock` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('1', 'a');
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('2', 'b');
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('3', 'c');
INSERT INTO `mylock` (`id`, `NAME`) VALUES ('4', 'd');
当一个线程获得对一个表的写锁之后,只有持有锁的线程可以对表进行更新操作。其他线程的读写操作都会等待,直到锁释放
为止
MyISAM写锁阻塞读案例写锁阻塞读案例
session1 session2
获取表的write锁定
lock table mylock write;
当前session对表的查询,插入,更新操作都可以执行
select * from mylock;
insert into mylock values(5,‘e’);
当前session对表的查询会被阻塞
select * from mylock;